使用strcmp / strncmp比较int8_t和char *

时间:2019-01-30 16:01:07

标签: c pointers char strcmp strncmp

当前正在尝试修复一段时间未使用的代码。

我有两个变量: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)时,两个变量都在上面返回该数据。

2 个答案:

答案 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行为的答案也是正确的。