昨天我有一次单元测试。其中一个程序是复制字符串并在没有字符串函数的情况下找到其长度。这是我编写的代码:
#include <stdio.h>
int main(){
char str1[100], str2[100] = {'a'};
printf("Enter a string\n");
fgets(str1, sizeof(str1), stdin);
int i;
for(i = 0; str1[i] != '\0'; i++){
str2[i] = str1[i];
}
str2[i] = '\0';
printf("Copied string = %s", str2);
printf("Length of string = %d", i-1);
}
我有一个相当惊讶的观察到!即使注释掉了str2[i] = '\0'
,该字符串也会被正确地打印,即在初始化中不应被覆盖的额外的'a'
。
在注释掉str2[i] = '\0'
后,我期望看到这个输出:
test
Copied string = testaaaaaaaaaaaaaaaaaaaaaaaaaaa....
Length of string = 4
以下是输出结果:
test
Copied string = test
Length of string = 4
< p>如何正确打印str2
?编译器是否识别了字符串的复制并自动添加了空终止符?我使用的是gcc,但clang也产生了类似的输出。< /p>
0
。请看我的回答以了解原因。 - Sourav Ghosh