c - 使用 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)
,两个变量都返回上面的数据。
解决方案
拥有以下内容是不够的:
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 char 允许strcmp在任何情况下都不会退出foo的候选人
请注意,如果您在第一种情况下执行相同的问题,而在fooprintf("%s", foo);
的 'b' 之后没有到达内存中的空字符,函数printf将尝试将内存写入字符,但这是未定义的行为
推荐阅读
- python - Python中的findfrequency spec.ar等价物
- amazon-web-services - AWS - 如何为 fifo lambda 创建事件源映射?
- postgresql - 在 PostgreSQL 中复制 Oracle 的 `TRUNC(DATE, 'WW')` 行为
- azure - 从 UI 定义 AKS pod-cidr
- python - Python 程序在通过 Windows 服务运行时崩溃
- matlab - 创建分散笛卡尔数据的网格网格以在球体上绘图
- bash - sed 命令删除无效的 xml 字符不起作用
- python - 为什么只有在不修复 HDF5 弃用警告时才能处理大文件?
- python - 添加零以使所有子集大小相同,然后将它们相加并在 Excel 中显示
- javascript - 数组中的答案不能消失