2014-07-06 126 views
-1

下面顯示的代碼旨在首先處理字符串p的內容,然後打印其內容。我使用兩個while循環和一個printf語句測試了代碼。c中的初始化字符串給出奇怪的輸出

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char p[10] = "Hello"; 
    char *a = p; 
    while(*a++) 
     ; 
    *a++ = '1'; 
    *a++ = '\0'; 
    a = p; 
    int i; 
    for(i = 0; i < 10; i++) 
     putchar(a[i]); 
    putchar('\n'); 
    for(i = 0; i < 10; i++) 
     putchar(p[i]); 
    putchar('\n'); 
    printf("%s\n", p); 
    return 0; 
} 

輸出:

[email protected]:~$ gcc -o test test.c 
[email protected]:~$ ./test 
Hello1 
Hello1 
Hello 

現在,我在我的兩分的問題,首先,要被打印的7個字符(包括NULL)後顯示在頭兩行中的所有垃圾值。其次,爲什麼printf語句的輸出是'Hello',而應該是'Hello1'?

回答

1

一,有沒有垃圾,有兩個原因。一個是

char p[10] = "Hello"; 

相當於與

char p[10] = { 'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0 }; 

我。即它將未列出的成員初始化爲零(更準確地說,它將它們初始化,就好像它們是static一樣)。

其次,即使它們確實是未初始化的,您也無權期待垃圾值。讀取未初始化的變量只是未定義的行爲,所以可能有任何東西。

二,因爲你最終編寫了 過去 NUL終止符,因爲你迭代通過字符串的方法是錯誤的。所以,循環putchar,它遍歷每個字符將打印所有這些,包括過去的NUL '1',但printf()將終止遇到的第一個NUL。 。TL; DR:不是

while *(a++); 

你應該寫

while (*a) 
    a++; 
0

嘗試取出一段時間後;和不增加a兩次......

+0

沒有,那就是**完全錯誤**很顯然你不明白的代碼應該做的。如果你在'while'後面去掉分號,它會用'1'來填充所有的字符串。這不是OP想要的。 –

+0

@ user3477950你的結論是什麼?** OP想要什麼樣的垃圾? – SomeWittyUsername

+0

這不是垃圾。你的答案不回答第一部分,它回答第二部分。 (順便說一句,關於我的結論:經驗,我看到很多人提出與此相同的問題,並且他們總是毫無例外地毫無例外地尋找「垃圾」,因爲缺乏初始化,這是一種神話。) –