2016-12-13 26 views
0

當字符數組substring[#]設置爲[64]時,該文件輸出一個附加字符。附加字符隨每次編譯而變化。有時爲es?,有時爲esx等。C爲什麼一個不相關/未聲明的變量影響另一個的輸出?

如果我將[64]更改爲任何其他號碼(至少是我嘗試過的號碼:65,256,1 ..),它會正確輸出爲es

更爲奇怪的,如果我離開未使用/未聲明的字符數組char newString[64]在這個文件中,它輸出的正確子es甚至與64

  1. 怎樣的64看似隨意的大小影響了?
  2. 完全無關的字符數組(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; 
} 
+1

小心正確使用'strncpy';它不會追加終止零。看起來好像你認爲它會將一個子串「提取出來」。 – usr2564301

+3

您的程序有未定義的行爲。所以你的問題的整個前提是錯誤的 - 對於UB的行爲沒有任何要求。你的問題應該是 - 我的代碼中的錯誤在哪裏。答案可能在這裏:'strncpy(substring,string + 1,1)'。 'string + 1'跳過整個字符串緩衝區並指向它後面的字節。而且您也只複製1個字節,然後嘗試將其打印爲字符串。 – kaylum

+0

您的輸入是什麼? – chux

回答

3

的問題是,strncpy()不會複製null終止。

使用strncpy()是安全的,同時危險的,因爲它不會總是複製null終止,也使用它的一個單字節是沒有意義的,而不是做這個

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

,並應當編制。

您應該閱讀手冊頁strncpy(3)以瞭解我的意思是否正確,如果您每次在較短的時間內成爲更好的程序員時仔細閱讀手冊。

+1

我建議測試字符串的長度是否至少爲2,以便在實際字符串結尾(可能不是意圖)之後不接管字符。例如if(strlen(string)> = 2)substring [0] = string [1] else substring [0] ='\ 0'; –

+0

@StephanLechner這將是一個非常好的做法來檢查,我不會改變答案,因爲評論是足夠的。 –

相關問題