当字符数组substring[#]
设置为[64]
时,文件输出一个额外的字符。附加字符因每次编译而异。有时 es?
,有时 esx
等等。
如果我将 [64]
更改为任何其他数字(至少我尝试过的数字:65、256,1..),它会正确输出为 es
.
更奇怪的是,如果我在这个文件中保留未使用/未声明的字符数组 char newString[64]
,即使是 64,它也会输出正确的子字符串 es
。
- 看似任意大小的 64 对输出有何影响?
- 完全不相关的字符数组 (
newString
) 如何影响另一个字符数组的输出方式?
.
int main () {
char string[64];
char newString[64];
char substring[64];
fgets(string,64,stdin);
strncpy(substring, string+1, 1);
printf("%s\n", substring);
return 0;
}
最佳答案
问题是,strncpy()不会复制 null
终止符,因为您已要求它不要这样做。
使用 strncpy()
既安全又危险,因为它不会总是复制 null
终止符,而且对单个字节使用它是没有意义的,而是这样做
substring[0] = string[1];
substring[1] = '\0';
它会起作用。
您应该阅读手册页 strncpy(3)正确理解我的意思,如果你每次都仔细阅读手册,你会在更短的时间内成为更好的程序员。
关于C 为什么不相关/未声明的变量会影响另一个变量的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132251/