scanf gets

scanf( )函數和gets( )函數都可用於輸入字符串,但在功能上有區別。若想從鍵盤上輸入字符串"hi hello",則應該使用__gets__函數。

gets可以接收空格;而scanf遇到空格、回車和Tab鍵都會認爲輸入結束,所有它不能接收空格。

char string[15]; gets(string); /*遇到回車認爲輸入結束*/

scanf("%s",string); /*遇到空格認爲輸入結束*/

所以在輸入的字符串中包含空格時,應該使用gets輸入。

scanf和gets獲取字符串時的區別

在C語言中,能構獲取字符串的函數至少有兩個:

1.scanf()

所在頭文件:stdio.h

語法:scanf("格式控制字符串",變量地址列表);

接受字符串時:scanf("%s",字符數組名或指針);

2.gets()

所在頭文件:stdio.h

語法:gets(字符數組名或指針);

兩者在接受字符串時:

1.不同點:

scanf不能接受空格、製表符Tab、回車等;

而gets能夠接受空格、製表符Tab和回車等;

第一:要注意不同的函數是否接受空格符、是否捨棄最後的回車符的問題!
讀取字符時:
scanf()以Space、Enter、Tab結束一次輸入,不會捨棄最後的回車符(即回車符會殘留在緩衝區中);
getchar()以Enter結束輸入,也不會捨棄最後的回車符;
讀取字符串時:
scanf()以Space、Enter、Tab結束一次輸入
gets()以Enter結束輸入(空格不結束),接受空格,會捨棄最後的回車符!

第二:爲了避免出現上述問題,必須要清空緩衝區的殘留數據,可以用以下的方法解決:
方法1:C語言裏提供了函數清空緩衝區,只要在讀數據之前先清空緩衝區就沒問題了!
       這個函數是fflush(stdin)。
方法2:自己取出緩衝區裏的殘留數據。
       scanf("%[^\n]",string);

在數據大量的情況下,用gets讀取快於scanf()10倍以上

2.相同點:

字符串接受結束後自動加'\0'。

例1:

#include <stdio.h>
main()
{
char ch1[10],ch2[10];
scanf("%s",ch1);
gets(ch2);
}

依次鍵入asd空格fg回車,asd空格fg回車,則ch1="asd\0",ch2="asd fg\0"。

例2:

#include <stdio.h>
main()
{
char ch1[10],ch2[10],c1,c2;
scanf("%s",ch1);
c1=getchar();
gets(ch2);
c2=getchar();
}

依次鍵入asdfg回車,asdfg回車,則ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需輸入。

scanf :當遇到回車,空格和tab鍵會自動在字符串後面添加'\0',但是回車,空格和tab鍵仍會留在輸入的緩衝區中。

gets:可接受回車鍵之前輸入的所有字符,並用'\n'替代 '\0'.回車鍵不會留在輸入緩衝區中

gets()用到讀取字符串,用回車結束輸入

scanf()可以讀取所有類型的變量




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章