爲了讀取多字字符串,我一直使用gets()函數。 gets()
函數的行爲對我來說是不可預知的,我在每個gets()
語句之前使用語句fflush(stdin)
來避免問題。這種說法是否恰當地使用這種說法?什麼可以是一種替代方法?使用fflush(stdin)語句的適當性如何?
3
A
回答
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;
}
3
fflush
只有刷新輸出流。
如果你想沖洗標準輸入,請繼續閱讀,直到你得到EOF
,是這樣的:
int i;
while (((i = getchar()) != '\n') && (i != EOF));
1
您可以使用scanf函數聲明適當的正則表達式。
scanf("%[^\n]s",str);
或者可能是fgets語句。 fgets(str, sizeof(str),stdin));
相關問題
- 1. fflush()函數不能使用stdin
- 2. fflush(stdin)的替代方案?
- 3. 如何在簡單的tic tac toe輸入中使用fflush(stdin)?
- 4. 爲什麼不會fflush(stdin)的工作?
- 5. 如何用不可變集合和適當的語句寫適當的Scala?
- 6. fflush(stdin)函數不能正常工作?
- 7. 如何沖洗I/O流?我正在使用scanf(),fflush(stdin)不起作用
- 8. 如何使RAD Studio格式的case語句適當?
- 9. 程序在scanf()之後不執行gets(),甚至使用fflush(stdin)
- 10. 爲什麼我應該在這個程序中使用fflush(stdin)?
- 11. 適當的PyroStreams在PyroCMS中的語句
- 12. 如何使當語句groupMatcher上的Mockito
- 13. asp.net的SqlDataSource的DetailView:如何設置適當的select語句
- 14. 重構if語句使用適當的模式
- 15. 適當的方式來使用if/else語句與Windows滾動
- 16. grep語句不適用於case語句
- 17. 如何爲MERGE語句發送適當的HTTP狀態?
- 18. 我將如何創建適當的UPDATE語句
- 19. fseek(stdin,1,SEEK_SET)或rewind(stdin)可用於刷新輸入緩衝區而不是非便攜式fflush(stdin)?
- 20. 使用「checked」屬性時適當的XHTML語法?
- 21. 如何使用「if」語句
- 22. 如何使用break語句
- 23. 如何使用switch語句?
- 24. 如何使用#define語句
- 25. 如何使用Case語句
- 26. 如何使用max語句
- 27. 如何使用MERGE語句
- 28. 如何使用語句
- 29. 如何使用break語句
- 30. 如何使用where語句?
謝謝!但是,如果事先不知道BUFSIZ並且使用char指針創建一個字符串,那麼fgets()如何使用? – amulous
BUFSIZ只是一個常量,需要像#define BUFSIZ 255或其他東西一樣定義... – duDE