當字符數組substring[#]
設置爲[64]
時,該文件輸出一個附加字符。附加字符隨每次編譯而變化。有時爲es?
,有時爲esx
等。C爲什麼一個不相關/未聲明的變量影響另一個的輸出?
如果我將[64]
更改爲任何其他號碼(至少是我嘗試過的號碼:65,256,1 ..),它會正確輸出爲es
。
更爲奇怪的,如果我離開未使用/未聲明的字符數組char newString[64]
在這個文件中,它輸出的正確子es
甚至與64
- 怎樣的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';它不會追加終止零。看起來好像你認爲它會將一個子串「提取出來」。 – usr2564301
您的程序有未定義的行爲。所以你的問題的整個前提是錯誤的 - 對於UB的行爲沒有任何要求。你的問題應該是 - 我的代碼中的錯誤在哪裏。答案可能在這裏:'strncpy(substring,string + 1,1)'。 'string + 1'跳過整個字符串緩衝區並指向它後面的字節。而且您也只複製1個字節,然後嘗試將其打印爲字符串。 – kaylum
您的輸入是什麼? – chux