当前正在尝试修复一段时间未使用的代码。
我有两个变量:int8_t foo[size]
和const char* const bar
。
有一个if检查if(0 != strcmp((char *)foo, bar))
即使printf("%s | %s", foo, bar)
返回两个完全相同的字符串,当前操作仍然失败。我也尝试了strncmp
,但同样失败了。
通过在线研究,我知道这很可能是由于终止空字节而引起的,但是我不知道如何解决/解决这个问题。
int8_t foo[size];
const char* const bar;
if(0 != strcmp((char *)foo, bar)){
fail
}
预期结果是strcmp
返回0,因为打印时两个字符串都相同。
实际结果:返回失败。
实际数据:5352A565712345657567565785658956581
运行printf("Value of foo and bar: %s and %s", foo, bar)
时,两个变量都在上面返回该数据。
答案 0 :(得分:0)
仅仅拥有:
int8_t foo[] = { 'a', 'b' };
能够做到
if (strcmp(foo, "ab") == 0)
puts("equals");
else
puts("not equal");
因为 strcmp 像许多其他处理 char * 的函数一样,期望空字符表示字符串的结尾。
当 strcmp 在 foo 中的'b'之后出现时,附加的内容是未定义的行为
如此
int8_t foo[] = { 'a', 'b', 0 };
是strcmp(foo, "ab")
的候选者,这要归功于添加的null字符使 strcmp 在任何情况下都不会超出 foo
请注意,如果在第一种情况下执行printf("%s", foo);
,则会发生相同的问题,而在 foo 函数中的'b'之后,内存中没有空字符printf 将尝试以字符形式写入内存,但这是未定义的行为
答案 1 :(得分:0)
尽管在编译时收到警告,但我无法重新创建此方案。
预期的行为是什么?
您是说比较失败,还是代码无法进入if
块?
如果两个数组包含相同的数据,则strcmp()
将返回0,然后if
块将不会执行。
我只是想澄清一下。布鲁诺关于strcmp行为的答案也是正确的。