小编Lau*_*nce的帖子

将时间字符数组转换为C中的整数

我不经常使用C,所以这对我来说有点棘手,尽管我确信这是一项非常简单的任务.我一直在努力研究如何做到这一点,我不认为我每次搜索都正确地说它.

我需要帮助搞清楚如何将char数组中的数字转换为整数.

基本上,我会有一个像"1:09 pm","11:12 AM","11:12 am"等字符数组.

我想弄清楚如何将这三件事分开,这样我就可以弄清楚(1)小时数,(2)分钟数,以及(3)是上午还是上午(大写与否)

到目前为止,我认为我有办法获得第一个数字:

char *time = arg[1]; // arg[1] is "1:09pm", etc
char *hours = strtok(time, ":");
int hours = atoi(hours);
Run Code Online (Sandbox Code Playgroud)

从那里,我不是100%肯定该怎么做.是否存在某种正则表达式类型解析函数,它将从":"转换为字母字符?

先感谢您!

c arrays string time

5
推荐指数
1
解决办法
114
查看次数

确定性上下文无关语法与上下文无关语法?

我正在阅读我的比较语言课的笔记,我有点困惑......

上下文无关文法和确定性上下文无关文法有什么区别?我正在专门阅读有关 CFG 的解析器是 O(n^3) 以及 DCFG 的编译器是 O(n) 的内容,并且并不真正理解时间复杂度的差异如何如此之大(更不用说我仍然对使 CFG 成为 DCFG 的特征感到困惑)。

非常感谢您!

big-o parsing programming-languages context-free-grammar context-free-language

5
推荐指数
1
解决办法
2367
查看次数

为什么我的动态分配的结构数组不在C中工作?

我一直在尝试创建一个动态分配的struct类型数组,label并且一直在失败.在我的.h文件中,我有:

    typedef struct _label {
            char name[256];
            char type[256];
            int address;
} label;
Run Code Online (Sandbox Code Playgroud)

在我的.c文件中,我在顶部有这个:

    label* allLabels = (label*) malloc(sizeof(label) * 10); // line 10
    int arrayIndex = 0;
Run Code Online (Sandbox Code Playgroud)

最后,我在同一个.c文件中有一个函数,用于将这些结构对象添加到数组中,供文件中的其他方法使用:

    void addLabel(char line[], char type[], int addr) {
            label database;
            database.name = line; // line 805
            database.type = type; // line 806
            database.address = addr;
            allLabels[arrayIndex] = database;
            arrayIndex++;
        }
Run Code Online (Sandbox Code Playgroud)

基本上我只想拥有一组可访问的标签.有人能帮助我理解我做错了什么吗?

我收到这些错误,我也没有忘记任何必要的#include语句:

formatBuilder.c:10:3: error: initializer element is not constant
formatBuilder.c: In function 'addLabel':
formatBuilder.c:805:18: error: incompatible types when assigning …
Run Code Online (Sandbox Code Playgroud)

c arrays struct dynamic-allocation

2
推荐指数
1
解决办法
864
查看次数

MIPS标签寻址?

这都是相关的,我尽我所能将它们拼合起来,所以请耐心等待。

我对如何正确处理标签感到非常困惑。例如,在下面的代码位中,“ bne”转换为“ 00010101001001010000000000000001”,并且loopend的标签地址为0x00000020(32)

.text
    la $a0, opOne   
    lw $a0, 0($a0)
    la $a1, opTwo
    lw $a1, 0($a1)
    add $t0, $zero, $a0
    addi $t1, $zero, 1
    bne $t1, $a1, loopend
    addi $t1, $t1, 1
loopend:
Run Code Online (Sandbox Code Playgroud)

当我向上移动loopend时,“ bne”变为“ 00010101001001011111111111111111”,loopend的地址变为0x00000008(8)

.text
    la $a0, opOne   
    lw $a0, 0($a0)
loopend:
    la $a1, opTwo
    lw $a1, 0($a1)
    add $t0, $zero, $a0
    addi $t1, $zero, 1
    bne $t1, $a1, loopend
    addi $t1, $t1, 1
Run Code Online (Sandbox Code Playgroud)

因此,据我了解,在代码的第一位loopend是在八条指令之后,因此它的地址是4 * 8 = 32 = 0x00000020。在代码的第二位中,loopend是在两条指令之后,因此其地址为4 * 2或0x00000008。 …

assembly mips machine-language labels addressing

2
推荐指数
1
解决办法
1万
查看次数