深入了解scanf()/getchar()和gets()等函數
今天看到一段話,大致是說gets比scanf()快,有點吃驚,搜了一下,scanf()和gets的區別大致有着幾條:
1.scanf() 會忽略行開頭的所有空格,並以空格、換行符結束輸入;
使用getchar()讀取scanf語句執行后,緩沖區留下的換行符,
gets讀入以任何字符開始的字符串,以換行符結束,但之后會丟棄換行符並以'\0'代替;
2. 在數據大量的情況下,用gets讀取快於scanf()10倍以上(注:來自pudn,只有一段開頭話)
3.
第一:要注意不同的函數是否接受空格符、是否舍棄最后的回車符的問題!
讀取字符時:
scanf()以Space、Enter、Tab結束一次輸入,不會舍棄最后的回車符(即回車符會殘留在緩沖區中);
getchar()以Enter結束輸入,也不會舍棄最后的回車符;
讀取字符串時:
scanf()以Space、Enter、Tab結束一次輸入
gets()以Enter結束輸入(空格不結束),接受空格,會舍棄最后的回車符!
第二:為了避免出現上述問題,必須要清空緩沖區的殘留數據,可以用以下的方法解決:
方法1:C語言里提供了函數清空緩沖區,只要在讀數據之前先清空緩沖區就沒問題了!
這個函數是fflush(stdin)。
方法2:自己取出緩沖區里的殘留數據。
(說實話這個語句我也沒看懂,呵呵!為什么格式控制是這樣的!希望高手指點一下!)
scanf("%[^\n]",string);
實驗代碼:單詞接龍,輸入 n 和n個單詞 判斷 這些單詞是否是首尾相同的
#include<iostream> #include<string.h> using namespace std; int main() { int n; char word_pre[11]; char word[11]; bool isNo = false; while(scanf("%d",&n)!=EOF) { //fflush(stdin); getchar(); isNo = false; for(int i=0;i<n;i++) { if(i == 0) //scanf("%s",word_pre); gets(word_pre); else { //scanf("%s",word); gets(word); if(word_pre[strlen(word_pre)-1] == word[0]) { strcpy(word_pre,word); } else { isNo = true; break; } } } if(isNo) printf("No\n"); else printf("Yes\n"); } return 0; }
Language | C | C++ | Pascal |
To read numbers | int n; while(scanf("%d", &n) != EOF) { ... } |
int n; while (cin >> n) { ... } |
var n: integer; ... while not seekeof do begin read(n); ... end; |
To read characters | int c; while ((c = getchar()) != EOF) { ... } |
char c; while (cin.get(c)) { ... } |
var c: char; ... while not eof do begin read(c); ... end; |
To read lines | char line[1024]; while(gets(line)) { ... } |
string line; while (getline(cin, line)) { ... } |
var line: string; ... while not eof do begin readln(line); ... end; |