2012-02-23 52 views
1

好吧,我確定有些東西我在這裏失蹤,但我不知道它是什麼,我希望有人能幫我弄明白。從fgetc()讀取輸入並使用printf()打印

我正在閱讀命令行的輸入內容,並且正在編寫一個使用fgetc()來執行此操作的函數。然而,功能上看似膚淺的變化使其表現完全不同。

這是main()函數:

while(1) 
{ 
    char* cmd = malloc(sizeof(char) * 80); 
    printf("Enter command: "); 
    read_flush(cmd, 80); 
    printf("%s\n", cmd); 
    free(cmd); 
} 

這是()read_flush的版本之一:

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    for(i = 0; i < count; i++) 
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
    } 

    return i; 
} 

這一個工作正常。你輸入輸入,它會將其吐出。 但是,這個下一個版本會導致main一遍又一遍地打印「Enter command:」而不給用戶輸入輸入的機會。

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    while(i < count)  
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
     i++; 
    } 

    return i; 
} 

fgetc()我有什麼微妙之處嗎?

回答

1

嘗試初始化i在您的第二個read_flush實施。

+0

哇,哎呀。是的,就是這樣。 – user1227489 2012-02-23 05:28:15

+0

保持總是初始化變量的習慣是很好的,特別是在處理指針時。它會爲你節省很多頭痛的道路。 – 2012-02-23 14:41:00

1

在第二個版本中,它看起來像你沒有像在第一個版本中那樣初始化爲零。因此,它可能從一個大於count的垃圾值開始,因此循環從不執行。

1

兩個版本都有相同的錯誤。您不要在字符串的末尾添加NUL。 malloc不會初始化它返回的內存。

+0

+1:非常重要的一點。 – 2012-02-23 05:50:44