C为什么不相关/未声明的变量会影响另一个变量的输出?

时间:2016-12-13 23:20:45

标签: c substring strncpy

当字符数组substring[#]设置为[64]时,文件会输出一个附加字符。附加字符随每次编译而变化。有时为es?,有时为esx等。

如果我将[64]更改为任何其他号码(至少是我尝试过的号码:65,256,1 ..),则会正确输出es

更奇怪的是,如果我将未使用/未声明的字符数组char newString[64]留在此文件中,即使使用64,它也会输出正确的子字符串es

  1. 看似任意大小的64如何影响out?
  2. 完全不相关的字符数组(newString)如何影响另一个字符数组的输出?
  3. 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;
    }
    

1 个答案:

答案 0 :(得分:3)

问题是,strncpy()不会复制null终止符,因为您已经要求不这样做。

同时使用strncpy()既安全又危险,因为它不会始终复制null终止符,同时使用单个字节也无意义,而是执行此操作

substring[0] = string[1];
substring[1] = '\0';

它会起作用。

如果您在较短时间内成为更好的程序员时仔细阅读本手册,则应阅读手册页strncpy(3)以正确理解我的意思。