C语言中的字符数组比较

4

我有以下用于在C语言中比较两个字符数组的函数:

short test(char buffer[], char word[], int length) {
    int i;
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

在主函数中有一段代码:

char buffer[5]; //which is filled correctly later
...
test(buffer, "WORD", 5);

当i = 0时,它立即返回0。如果我将函数更改为以下内容:

short test(char buffer[], int length) {
    int i;
    char word[5] = "WORD";
    for(i = 0; i < length; i++) {
        if(buffer[i] != word[i]) {
            return 0;
        }
    }
    return 1;
}

...它的工作效果非常好。在函数测试的第一个版本中,调试器显示缓冲区和单词数组的类型为char*。在函数测试的第二个版本中,它显示缓冲区的类型为char*,而测试数组的类型为char[]。函数strcmp()也无法工作。

这里实际上出了什么问题?程序是为PIC微控制器设计的,编译器是C18,IDE是MPLAB。


抱歉,ukaz是从哪里来的? - Jekyll
糟糕...忘记翻译了!现在已经更正了。@MitchWheat - CAPS LOCK
2
我假设你知道它会立即返回0,因为你在那里放了一个printf()或其他东西来查看。为什么不看看buffer[0]和word[0]是什么?这可能是你正在寻找的线索。 - Travis Griggs
@Jekyll 好的,那就是5。但我仍然不明白这与在检查第一个字符时返回0有什么关系。如果缓冲区填充了WORD并且单词填充了WORD,“W” ==“W”...但它说不是。 - CAPS LOCK
我在思考缓冲区溢出可能会影响索引变量或长度的事实。 - Jekyll
显示剩余8条评论
1个回答

4

嗯...

在嵌入式系统中,有时字符串存储的位置会有所不同。

在第一个示例中,您定义了一个仅存储在闪存代码区域中的字符串。因此,由于内存区域的差异,索引0处的比较将失败。

在第二个示例中,您定义了一个包含相同字符串的局部变量。这将位于RAM中,因此比较有效,因为它们都在RAM中。

我建议进行以下测试:

char buffer[5]; //which is filled correctly later
char word[5] = "WORD";
...
test(buffer, word, 5);

很可能会成功,因为比较是在内存中完成的。

是的,可以删除\0,因为“WORD”将自动以空字符结尾。


哥们,你救了大忙(晚上)。谢谢你! - CAPS LOCK
好的。事实上,PIC汇编不能比较闪存和RAM。而且那些小型设备编译器无法处理这种情况。有时候Keil和SDCC也会出现同样的问题。 - Remix
1
正如所指出的那样,这与PIC18具有哈佛架构、独立地址空间和用于访问FLASH中数据和RAM中变量的指令有关。标准库提供了一组备用字符串函数来处理FLASH指针,在这种情况下,您可以尝试使用strncmppgm2ram(buffer, "WORD", length)。顺便说一句:MCC18是一个令人惊讶的可怕编译器,远远超出我在任何其他地方遇到的范围。如果您珍视自己的理智,请切换到XC18。 - doynax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接