2012-10-05 38 views
3

這裏簡單的代碼我沒有得到預期的輸出。沒有得到預期的輸出fgets()函數

#include<stdio.h> 

int main() 
{ 
    char buf[1024]; 
    while(1) 
    { 
     fgets(buf,strlen(buf),stdin); 
     printf("%s",buf); 
     printf("hello"); 
    } 
} 

在上面的代碼中,我希望無論從鍵盤輸入的字符串被輸出到我的相同,然後你好。 因爲我知道fgets()是一個阻塞函數,直到我從鍵盤輸入一個字符串,然後按ENTER鍵它會阻止程序,直到那個時候。所以,當我運行它,我希望它如下

$ ./a.out 
I input some text here <ENTER> 
I input some text here 
hello 

但實際上,我所得到的輸出是印在終端的「你好」無限循環。爲什麼我的fgets()不阻止該程序?任何想法?

回答

2

那是因爲你的緩衝區的strlen可能是零。你應該使用sizeof來代替它,它給你數組的大小(1024),而不是它包含的字符串的長度(在這裏是不確定的)。

它可能是在您的特定情況下爲零大小的字符串(*buf == '\0'),因爲fgets調用根本沒有阻止。實際上,它可以有一個的長度以及由於標準狀態:

的與fgets函數讀取比用n 從流中指定的字符數少至多一個指向流到陣列指出通過。沒有額外的 字符在換行符(保留)或文件結束後讀取。 A null字符是在讀入數組的最後一個字符後立即寫入的。

其實不然,因爲尚未初始化一個局部變量,buf可以包含任何所以你是不明智的依靠它(如果它不包含空值終止的一切,你因爲strlen運行結束,甚至可能會發現自己傾銷核心)。

如果您想要一個可靠的輸入函數,請參閱here。它具有緩衝區溢出保護功能,提示,在最後刪除換行符,並在過長的時間內清除剩餘的行。我會複製下面的代碼,使這個答案更獨立。

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

#define OK  0 
#define NO_INPUT 1 
#define TOO_LONG 2 
static int getLine (char *prmpt, char *buff, size_t sz) { 
    int ch, extra; 

    // Get line with buffer overrun protection. 
    if (prmpt != NULL) { 
     printf ("%s", prmpt); 
     fflush (stdout); 
    } 
    if (fgets (buff, sz, stdin) == NULL) 
     return NO_INPUT; 

    // If it was too long, there'll be no newline. In that case, we flush 
    // to end of line so that excess doesn't affect the next call. 
    if (buff[strlen(buff)-1] != '\n') { 
     extra = 0; 
     while (((ch = getchar()) != '\n') && (ch != EOF)) 
      extra = 1; 
     return (extra == 1) ? TOO_LONG : OK; 
    } 

    // Otherwise remove newline and give string back to caller. 
    buff[strlen(buff)-1] = '\0'; 
    return OK; 
} 
2

更改fgets()呼籲:

fgets(buf,sizeof(buf),stdin) 
//  ^^^^^^ 

調用未初始化bufstrlen()將返回誰知道是什麼。有機會strlen()將返回0在這種情況下fgets()將立即返回。

6

問題是strlen(buf)返回0,因爲buf [0]恰好是0(不保證)。您應該使用sizeof(buf)代替:

fgets(buf,sizeof(buf),stdin); 
0

你應該這樣使用sizeof(BUF)而不是strlen的(BUF):

fgets(buf,sizeof(buf),stdin); 

或直接:

fgets(buf,1024,stdin); 
+0

不_really_幻數的忠實粉絲。如果數組大小發生變化,那麼使用'sizeof'要好得多。如果你在不調整你的'fgets(1024)'的情況下將它改成'char buf [512]',那麼你就處於一個痛苦的世界。 – paxdiablo

+1

當然是,但它只是解釋fgets將處理的價值。 –

相關問題