You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给字符数组补'\0'后strcmp仍不生效?数组剩余元素是否为'\0'?

C语言字符数组与strcmp问题解答

问题1:补'\0'后strcmp仍不相等的原因

先看你提供的第一段代码:

// 以下代码中strcmp返回非零,buff与t1不相等
char buff[4] = "K7Ag";
buff[4] = '\0';
char t1[5] = "K7Ag";
if(strcmp(buff, t1) == 0) {
    printf("they are equal\n");
}

问题出在数组越界上:char buff[4]定义的数组只有4个元素,下标范围是0~3,buff[4]已经超出了数组的合法内存范围。这种越界赋值属于C语言的未定义行为——你以为给buff加了终止符,但实际上这个操作可能会修改其他变量的内存,或者被编译器忽略,导致buff的末尾依然没有有效的'\0'。

strcmp工作时会从数组起始位置一直读取,直到遇到'\0'才停止。因为buff没有正确的终止符,它会继续读取后面的垃圾内存数据,自然和t1(有合法'\0'的数组)比对结果不相等。

再看第二段能正常工作的代码:

// strcmp显示两者相等
char buff[5] = "K7Ag";

char t1[5] = "K7Ag";
if(strcmp(buff, t1) == 0) {
    printf("they are equal\n");
}

这里char buff[5]的数组长度足够容纳"K7Ag"(4个字符)加上终止符'\0',编译器会自动在buff的第4个下标位置填充'\0',此时buff的内存内容为{'K','7','A','g','\0'},和t1完全一致,strcmp自然判定相等。

问题2:未填满的字符数组元素是否都为'\0'?

是的。C语言标准明确规定:当用字符串字面量初始化字符数组时,数组中未被字符串字面量覆盖的剩余元素,会被自动初始化为'\0'。

比如char b1[100] = "Abcd";,"Abcd"占4个字符(A、b、c、d),所以b1[0]到b1[3]是这四个字符,从b1[4]到b1[99]的总共96个元素,全部都会被初始化为'\0'。


内容的提问来源于stack exchange,提问作者hodondo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:35:16