C语言strcmp比较char数组与char*字符串结果异常的原因及解决方法
你的strcmp结果异常的原因及解决办法
咱们来一步步拆解你遇到的问题:你预期strcmp(a, b[0])返回0,但实际得到了一个奇怪的负数,核心原因大概率是以下两个点之一:
1. 字符串缺少关键的终止符'\0'
C语言里的字符串必须以'\0'(空字符)结尾,strcmp函数会一直比较到遇到这个终止符为止。虽然你写了char a[100] = "\0";,这行代码原本会把数组所有元素初始化为'\0',但之后你给a[0]和a[1]赋值了'x'和'y'——结合你提到的电脑存在异常,有可能数组后续的'\0'被意外覆盖,此时a就变成了没有终止符的字符序列,strcmp会越界读取内存,返回随机的异常值。
2. 忘记包含<string.h>头文件
这是很多C语言新手容易踩的坑:如果调用strcmp却没有在代码开头包含<string.h>,编译器会默认假设这个函数的返回值是int,但实际函数的调用逻辑会因为缺少原型声明而被错误处理。在MSVC环境下,这种情况就可能返回0xCCCCCCCC(也就是你看到的-858993460),这是编译器标记未初始化栈内存的特殊值。
解决办法
- 手动确保字符串终止:在给
a赋值后,主动加上终止符,彻底避免终止符缺失的问题:a[0] = 'x'; a[1] = 'y'; a[2] = '\0'; // 手动添加终止符,确保字符串合法 - 必须包含头文件:在代码最开头加上,让编译器正确识别
strcmp的函数原型:#include <string.h> - 检查初始化逻辑:确认
a的初始化没有问题,char a[100] = "\0";是正确的初始化方式,但如果是局部变量,绝对不要省略初始化(比如不要写成char a[100];,未初始化的局部数组元素都是随机值)。
这样修改后,strcmp(a, b[0])应该就能返回预期的0了。
内容的提问来源于stack exchange,提问作者Brian Tsui
相关产品推荐
相关产品推荐

