1 string s; 2 getline(cin,s); 3 cout<<s<<endl; 4
5
6 char s[100]; 7 scanf("%[^\n]%*c",s); 8 printf("%s\n",s); 9
10
11 char s[100]; 12 gets(s); 13 printf("%s\n",s); 14
15
16 char s[100]; 17 cin.get(s,100); 18 printf("%s\n",s) 19
20
21 char s[100]; 22 cin.getline(s,100); 23 printf("%s\n",s);
下面介紹cin.get()和cin.getline()的區別:
可分為三種情況來看:
1)輸入的字符串不超過限定大小
get(str,Size):讀取所有字符,遇到'\n'時止,並且將'\n'留在輸入緩沖區中,其將被下一個讀取輸入的操作捕獲,影響該輸入處理;
getline(str,Size):讀取所有字符,遇到'\n'時止,並且將'\n'直接從輸入緩沖區中刪除掉,不會影響下面的輸入處理。
2)輸入的字符數超出限定的大小
get(str,Size):讀取Size-1個字符,並將str[Size-1]置為'\0',然后將剩余字符(包括'\n')留在輸入緩沖區中,這些字符將被下一個讀取輸入的操作捕獲,影響該輸入處理;
getline(str,Size):讀取Size-1個字符,並將str[Size-1]置為'\0',剩余字符(包括'\n')留在輸入緩沖區中,隨即設置cin實效位(即if(!cin)的判斷為真),關閉輸入。其后的所有輸入都無法得到任何東西,當然也無法得到輸入緩沖區中剩余的字符串。但如果象本例一樣用clear()重置cin,其后的輸入便可用並會得到遺留在輸入緩沖區中的字符。
3)輸入一個空行(即直接回車)
get(str,Size):str將得到'\0',並設置cin實效位,關閉輸入,但回車依然留在輸入緩沖區中,因此如果我們用clear()重置cin,其下一個讀取輸入的操作將捕獲'\n';
getline(str,Size):str將得到'\0',並將'\n'刪除掉,不置實效位,不關閉輸入。所以對於cin.getline來說空行是合法的輸入,且不會影響下面的輸入處理。
至於使用那個更好,可能因人習慣不同而不同,仁者見仁智者見智。對於我們編程來說,總希望能有更好的容錯性,即便用戶輸入了不合理的輸入,程序也應該能夠 提示並能夠重新輸入或繼續正常處理,而因為用戶的輸入問題而導致程序錯誤或其后的所有輸入都不可用顯然不是我們希望的。使用get(str,Size)和 getline(str,Size),都可能碰到設置失效位,關閉輸入的情況,故都是需要考慮到相應的防錯處理的。
