C
strings是由null
character(即代碼爲0
的字符)終止的字符序列。它可以表示爲'\0'
,'\x0'
或簡單地0
。
您的代碼填充str
三個字符但未能生成null
終止符。因此,puts()
會打印它在內存中找到的任何字符,直到它到達第一個字符null
。
您的代碼公開Undefined Behaviour。它可以做任何事情,這不是它的錯。
爲了解決它,你必須確保該字符串與null
終止字符:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read three chars
for(i = 0; i < 3; i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[3] = 0;
puts(str);
return 0;
}
更新
由於@JeremyP注意到一個評論,如果文件閱讀從(stdin
)結束之前的代碼讀取3
字符,fgetc()
將返回EOF
(文件結束)字符,也是有趣的非打印字符,讓你想知道它們來自哪裏。
寫這段代碼的正確方法是檢查輸入文件從中讀取之前達到EOF(feof()
):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
// Make room for 3 useful chars and the null terminator
char str[4];
// Read at most three chars
for(i = 0; i < 3 && !feof(stdin); i ++) {
str[i] = getc(stdin);
}
// Add the null terminator for strings
str[i] = 0;
puts(str);
return 0;
}
在C'char'串真的叫***空終止* ** *字節字符串*。該「零終止」部分很重要。如果你沒有在一個字符串中,那麼所有的字符串函數都會在搜索它的時候超出範圍,並且你將會有*未定義的行爲,這會使你的程序不合格*並且無效。 –
@某位程序員老兄_謝謝。爲什麼不跳過額外的輸入?我知道索引是0,1,2,索引2是空終止的。如果我輸入堆棧爲什麼不跳過確認? –
但你*不*終止'str'中的字符串,你讀了三個字符並將它們放入數組中。如果要讀取三個字符,則數組需要爲四個*大字符,最後一個元素爲終止符(您明確需要初始化)。 –