1. 程式人生 > >C語言scanf與get char,gets的區別

C語言scanf與get char,gets的區別

log lov 字符集 int printf you lock 下一個 nds

C語言scanf與get char,gets的區別


1.scanf()

scanf是C語言的格式輸入函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。
在這裏我想 列下一個‘格式化說明符’的表來自於下面這個鏈接
(https://blog.csdn.net/21aspnet/article/details/174326)

(A) 格式化說明符
格式字符 說明
%a 讀入一個浮點值(僅C99有效)
%A 同上
%c 讀入一個字符
%d 讀入十進制整數
%i 讀入十進制,八進制,十六進制整數
%o 讀入八進制整數
%x 讀入十六進制整數
%X 同上
%c 讀入一個字符
%s 讀入一個字符串
%f 讀入一個浮點數
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 讀入一個指針
%u 讀入一個無符號十進制整數
%n 至此已讀入值的等價字符數
%[] 掃描字符集合
%% 讀%符號

但是由於我初學C語言所以很多格式字符並沒有見過,這算是課外學習度娘上的知識啦,上面那個鏈接詳細講述了scanf的一些問題,可以去看一下哦。

我要講一個關於scanf從鍵盤輸入數據時,給多個變量賦的值之間一定要用空格、回車或者 Tab 鍵隔開,用以區分是給不同變量賦的值。而且空格、回車或 Tab 鍵的數量不限,只要有就行。一般都使用一個空格。(需要註意的是當你要給多個變量賦值的時候不要加上“逗號”,不然你在編譯的時候就需要把你輸進去的逗號再輸一遍了)
scanf()以Space(空格),Enter(回車),tab結束一次輸入,最後輸入的回車符不會被舍棄(留在緩沖區中)。

#include <stdio.h>
int main()
{
    char op1, op2;
    scanf("%c", &op1);
    scanf("%c", &op2);
    printf("%d %d\n", op1, op2);
    return 0;
}

運行結果

q
113 10
Process exited after 5.982 seconds with return value 0
請按任意鍵繼續. . .

看吧,此時你會發現輸出的第二個數是10,因為scanf會將緩沖區中的回車符讀取,當輸入緩沖區已經沒有東西的時候就會輸出結果。

2.get char()

getchar()是在輸入緩沖區【順序】讀入【一個】字符(包括Space、Enter和Tab還有字母,數字別忘了也算符號)依舊以Enter鍵結束,只不過Enter鍵也會被放入緩沖區。

這裏需要說一下如果你一次輸入了多個字符的話,那接下來它所取得字符會直接從緩沖區中取出。

#include <stdio.h>
int main()

{
    char op1,op2,op3;
    op1=getchar();
    op2=getchar();
    op3=getchar();
    printf("%d %d %d\n",op1,op2,op3);
    
    return 0;
}

以下是多種編譯運行結果

abc
97 98 99
Process exited after 6.842 seconds with return value 0
請按任意鍵繼續. . .


a b//註意中間有個空格
97 32 98
Process exited after 8.391 seconds with return value 0
請按任意鍵繼續. . .


a
b
97 10 98//這裏是輸入了字母a然後一個回車然後字母b(最後會輸入一個回車被留在了緩沖區中,只讀取了前三個字符)
Process exited after 13.01 seconds with return value 0
請按任意鍵繼續. . .

3.gets()

gets是從標準輸入設備(鍵盤)讀‘字符串’函數,它可以無限讀取,不會判斷上限,以回車結束讀取。可以說gets() 函數不僅比 scanf 簡潔,而且,就算輸入的字符串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字符數組。
此外,關於使用 gets() 函數需要註意:使用 gets() 時,系統會將最後“敲”的換行符從緩沖區中取出來,然後丟棄,所以緩沖區中不會遺留換行符。這就意味著,如果前面使用過 gets(),而後面又要從鍵盤給字符變量賦值的話就不需要吸收回車清空緩沖區了,因為緩沖區的回車已經被 gets() 取出來扔掉了。

# include <stdio.h>
int main(void)
{
    char wei[10];
    char op;
    printf("請輸入字符串:");
    gets(wei);
    printf("%s\n", wei);
    op = getchar();
    printf("op = %c\n", op);
    return 0;
}

請輸入字符串:I love you
I love you
w
op = w (上一個輸完I love you之後會輸入一個回車鍵,並沒有留在緩沖區,因此最後運行結果會正常輸出字母w)
Process exited after 24.39 seconds with return value 0
請按任意鍵繼續. . .

在這裏可以講述一下scanf與gets的一點區別
1.scanf :當遇到回車,空格和tab鍵會自動在字符串後面添加’\0’,但是回車,空格和tab鍵仍會留在輸入的緩沖區中。
gets:可接受回車鍵之前輸入的所有字符,並用’\n’替代 ‘\0’.回車鍵不會留在輸入緩沖區中。

2.scanf不能接受空格、制表符Tab、回車等;
gets能夠接受空格、制表符Tab和回車等;
它們字符串接受結束後自動加\0;

C語言scanf與get char,gets的區別