2014-07-08 50 views
-7

對於以下代碼,我添加了兩個printf語句來測試兩個字符串是否被正確讀取。然而,當我輸入類似:abcabcabcza,CB 的輸出:使用getchar()讀取兩個字符串

abcabcabcza▒

CB9

有誰知道在哪裏符號在第一字符串的結尾,而「9」在第二個字符串的末尾,從哪裏來?非常感謝!

printf("\nEnter two words, seperated by a comma: "); 
int temp1, temp2, index3, index4; char temp3[20], temp4[20]; 
index3=index4=0; 
while((temp1 = getchar())!= ','){ 
    temp3[index3++] = temp1; 
} 
printf("\n%s", temp3); 
while((temp2 = getchar())!= '\n'){ 
    temp4[index4++] = temp2; 
} 
printf("\n%s", temp4); 
+4

你需要在字符串末尾添加「\ 0」以便printf知道停止打印的位置。 temp3 []和temp4 []具有未定義的值。 – bestalign

+0

你能詳細解釋一下嗎?我怎樣才能防止這一點? – Jobs

+0

用0填充temp3 []和temp4 [] 0 – bestalign

回答

4

您需要在打印前串終止'\0'添加到您的字符串(或第一零出緩衝區的內存)。

另外:你已經聲明瞭大小爲20的緩衝區,但是在你的代碼中沒有守衛來尊重分配的長度,這意味着你可以超越它們並損壞內存。 [以大於20個字符的兩個單詞運行...]

1

'\ n'和'\ 0'在此處不同。您需要在字符串的末尾添加'\ 0',因爲printf會打印出字符串,直到遇到'\ 0'。 C不會初始化數組。如果你沒有手動初始化,它會有垃圾值。

我會做:

char temp3[20] = {0}; 
char temp4[20] = {0}; 

填寫TEMP3和TEMP3 0,這是一樣的 '\ 0'。

+3

('temp3 [20] = 0;')不好;最大的有效下標是'temp3 [19]'等。即使是這樣,固定它,它是在馬被閂上後將馬廄鎖上。有超過字符串的問題 - 或沒有檢查,以確保它不會發生。 –

1

C中的字符串需要以NULL結尾。 許多函數使用終止符來宣告字符串結束的處理器。

如果未終止,會發生什麼?讓我們得到一個簡單的字符串,消耗5個字節的內存。

...[?][?][H][e][l][l][o][?][?][?]...

這導致泄漏。正如你看到的,我們沒有存儲NULL。它會導致u/b,並且在任何新的運行中你可能會得到不同的標誌。對於我們來說,處理器會將字符串放入隨機的內存塊中。不過,默認情況下gcc有優化來防止這種情況。

1

當你給一個字符串「ABC」,它會被保存爲「ABC \ 0」,所以檢查\ 0也和不打印