首页 > 解决方案 > 使用 strcmp/strncmp 比较 int8_t 和 char*

问题描述

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

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

标签: cpointerscharstrcmpstrncmp

解决方案


拥有以下内容是不够的:

int8_t foo[] = { 'a', 'b' };

能够做到

if (strcmp(foo, "ab") == 0)
  puts("equals");
else
  puts("not equal");

因为strcmp与处理char *的许多其他函数一样,需要一个空字符来表示字符串的结尾。

strcmpfoo中的 'b' 之后附加是未定义的行为

所以

int8_t foo[] = { 'a', 'b', 0 };

strcmp(foo, "ab")是由于添加的 null char 允许strcmp在任何情况下都不会退出foo的候选人


请注意,如果您在第一种情况下执行相同的问题,而在fooprintf("%s", foo);的 'b' 之后没有到达内存中的空字符,函数printf将尝试将内存写入字符,但这是未定义的行为


推荐阅读