gets和scanf區別


scanf 和 gets 讀取字符串

深入了解scanf()/getchar()和gets()等函數

scanf與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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM