当字符数组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("%sn", substring);
return 0;
}
问题是,strncpy() 不会复制null
终止符,因为你要求它不要这样做。
使用strncpy()
既安全又危险,因为它不会总是复制null
终止符,将其用于单个字节也是没有意义的,而是这样做
substring[0] = string[1];
substring[1] = ' ';
它应该起作用。
你应该阅读手册页strncpy(3)来理解我的意思,如果你每次都仔细阅读手册,你会在更短的时间内成为一个更好的程序员。