1. 程式人生 > >C++中getline與C中scanf、gets小結

C++中getline與C中scanf、gets小結

 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream &is 表示一個輸入流,譬如cin;string&str表示把從輸入流讀入的字串存放在這個字串中(可以自己隨便命名,str什麼的都可以);char delim表示遇到這個字元停止讀入,在不設定的情況下系統預設該字元為'\n',也就是回車換行符(遇到回車停止讀入)。給大家舉個例子: string line; cout<<"please cin a line:" getline(cin,line,'#');
cout<<endl<<"The line you give is:"line; 那麼當我輸入"You are the #best!" 的時候,輸入流實際上只讀入了"You are the ",#後面的並沒有存放到line中(還在緩衝區裡)。然後程式執行結果應該是這樣的:  please cin a line:You are the #best!  The line you give is:You are the  而且這裡把終止符設為#,你輸入的時候就算輸入幾個回車換行也沒關係,輸入流照樣會讀入,譬如:                               please cin a line:You are the best!
//這裡輸入了一個回車換行       Thank you!       #   //終止讀入       The line you give is:You are the best! //換行照樣讀入並且輸出         Thank you! 以上就是getline()函式一個小小的例項了。 那麼如果把getline()作為while的判斷語句會怎麼樣呢? 讓我們一起來分析一下while(getline(cin,line))語句 注意這裡預設回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出迴圈。 在這個語句中,首先getline從標準輸入裝置上讀入字元,然後返回給輸入流cin,注意了,是cin,所以while判斷語句的真實判斷物件是cin,也就是判斷當前是否存在有效的輸入流。在這種情況下,我想只要你的電腦不中毒不發神經你的輸入流怎麼會沒有效?所以這種情況下不管你怎麼輸入都跳不出迴圈,因為你的輸入流有效,跳不出迴圈。
然而有些同學誤以為while判斷語句的判斷物件是line(也就是line是否為空),然後想通過直接回車(即輸入一個空的line)跳出迴圈,卻發現怎麼也跳不出迴圈。這是因為你的回車只會終止getline()函式的讀入操作。getline()函式終止後又進行while()判斷(即判斷輸入流是否有效,你的輸入流當然有效,滿足條件),所以又執行getline()函式。

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和回車等;

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()可以讀取所有型別的變數