2013-06-24 16 views
3

爲了讀取多字字符串,我一直使用gets()函數。 gets()函數的行爲對我來說是不可預知的,我在每個gets()語句之前使用語句fflush(stdin)來避免問題。這種說法是否恰當地使用這種說法?什麼可以是一種替代方法?使用fflush(stdin)語句的適當性如何?

回答

2

您可以用fgets()代替gets()函數:https://stackoverflow.com/a/4309760/1758762

其他人一樣說,gets()的規範替代是fgets()指定stdin作爲文件流。

char buffer[BUFSIZ]; 

while (fgets(buffer, sizeof(buffer), stdin) != 0) 
{ 
    ...process line of data... 
} 

沒有人提到的是gets()不包括換行符,但fgets()會做。所以,你可能需要使用圍繞與fgets(包裝),其刪除換行符:

char *fgets_wrapper(char *buffer, size_t buflen, FILE *fp) 
{ 
    if (fgets(buffer, buflen, fp) != 0) 
    { 
     size_t len = strlen(buffer); 
     if (len > 0 && buffer[len-1] == '\n') 
      buffer[len-1] = '\0'; 
     return buffer; 
    } 
    return 0; 
} 
+0

謝謝!但是,如果事先不知道BUFSIZ並且使用char指針創建一個字符串,那麼fgets()如何使用? – amulous

+0

BUFSIZ只是一個常量,需要像#define BUFSIZ 255或其他東西一樣定義... – duDE

3

fflush只有刷新輸出流。

如果你想沖洗標準輸入,請繼續閱讀,直到你得到EOF,是這樣的:

int i; 
while (((i = getchar()) != '\n') && (i != EOF)); 
1

您可以使用scanf函數聲明適當的正則表達式。

scanf("%[^\n]s",str); 


或者可能是fgets語句。

fgets(str, sizeof(str),stdin));

相關問題