2014-03-06 75 views
0

我寫了一個簡單的方法,從一個長字符串獲取輸入並打印它。我將數據保存在char數組中,並嘗試將數組的最後一個元素設置爲'\ 0',以便終止空值,以便我可以printf(%s,array)。C字符數組打印爲字符串錯誤,接受空終止?

#include <stdio.h> 
#define MAX 9 
#define DEBUG 1 
int QUIT = 0; 
int assignNewBoard(void); 

void main (int argc, char *argv[]) { 
    assignNewBoard(); 

    } 

int assignNewBoard(void) { 
    int row,col , count=0,maxCount=(MAX*MAX); 
    char ch; 
    char input[maxCount+MAX]; //our buffer with room for overflow. 
          //Hopefully never more than 90chars. 

    while((ch = fgetc(stdin)) != '\n') { 
    //input checks 
    if(feof(stdin)){ 
     if(DEBUG) printf("Finished!\n"); 
     QUIT = 1; 
    } 

    count++; 
    input[count] = ch; 
    } 

    if(DEBUG)printf("::"); 

    input[count+1] = '\0'; //null termination for printing. 
    printf("%s\n",input);//This doesn't seem to happen at all in output! 

    if(DEBUG) printf("We got %d count!\n", count); 

    return 0; 
} 

但上述代碼不會將我的字符數組打印爲字符串!只需在:: in控制檯後打印空白即可! 那麼我在這裏做錯了什麼?在我的代碼中,我一直在這樣工作,但現在不是這樣,即使在簡化的文件中也是如此!

運行時應該有一行「:(:(輸入)」,但行簡單地是「::」來代替。

我正在使用GCC進行編譯。

+2

有什麼問題? –

+0

更好地解釋了問題。 – user1695505

+0

似乎對我來說很好,這取決於你真正想要做什麼。編輯:它爲我打印一個字符串,你使用什麼IDE /編譯器? –

回答

4

在對它做任何事情之前,您都會增加count,因此您讀取的第一個字符爲input[1]。數組索引從C中的0開始;數組中第一個字符的值input[0]是垃圾,因此您獲得的輸出可能會不時變化。 (行爲未定義)。

您還應該特別檢查一下,count永遠不會太大以致於無法運行緩衝區的末端。如果發生這種情況,那麼它可能會導致您的程序在別處崩潰,並且這些錯誤可能難以調試。

+0

良好的捕獲,甚至沒有編譯和運行前檢查計數。在代碼塊中適用於我,但這意味着它可能會在構建過程中嘗試修復它。永遠不要依靠編譯器來修復你的錯誤:) –

+0

很好的解釋!我提出了我的計數++;我的任務完成後,我總是從[0]開始,修復了一切!非常感謝! – user1695505

2

爲什麼你想要做所有的事情......你可以簡單地這樣做。掃描字符串直到\ n並打印出來。

#include<stdio.h> 
    int main(){ 
     char str[90]; 
     scanf("%[^\n]",str); 
     printf("%s",str); 
     return 0; 
    } 
+1

也許是一項家庭作業。作爲一名CS導師,我在課堂上看到很多課堂上的任務,其中教師說「使用fgetc來完成此任務」或「不要使用sscanf」等。如果我曾經成爲教授任何類型編程的教師,試圖擺脫這種教學。教授最佳實踐,然後讓學生自己完成,也許在反饋過程中提出有效的最佳實踐建議。 –

+0

這樣更高效,我後來想到了,但我不確定如何格式化,所以我按照我所知道的去做了。請告訴我,這將返回EOF,或者我怎麼能注意到我在EOF? – user1695505