今天做TJU的OJ ,其中一道題是先讀入一個字符串,再讀入一個整數,循環往復,直到字符串是空,也就是說回車鍵結束循環。
但是cin對空格和回車都不敏感,都不影響繼續讀入數據,所以需要一種新的方式檢測回車。
方法一:利用getchar()函數
1 //**************************將輸入的單詞逆序輸出*************************// 2 #include <iostream> 3 #include<stack> 4 #include <stdio.h> 5 #include<stdlib.h> 6 using namespace std; 7 8 int main(){ 9 string temp; 10 stack<char> s;// 11 int time; 12 cin >> time; 13 14 for(int i = 0; i < time ; i++){ 15 16 while(cin >> temp ){ //把輸入賦值 17 for(int j = 0; j < temp.length(); j++){ 18 s.push(temp[j]); 19 } 20 21 while(!s.empty()){ 22 cout << s.top() ; 23 s.pop(); 24 } 25 if (getchar() == '\n') //檢測如果是空格,退出循環; 26 break; 27 cout << " "; 28 } 29 cout << endl; 30 } 31 return 0 ; 32 }
getchar()是stdio.h中的庫函數,它的作用是從stdin流中讀入一個字符,getchar()函數等待輸入直到按回車才結束(前提是緩沖區沒有數據),回車前的所有輸入字符都會逐個顯示在屏幕上。但只有第一個字符作為函數的返回值。
舉個例子:
1 #include "stdio.h" 2 #include "stdlib.h" 3 int main(void) 4 { 5 char c; 6 while((c=getchar())!='\n') //每個getchar()依次讀入一個字符 7 printf("%c",c); //按照原樣輸出 8 printf("\n"); 9 system("pause"); 10 return 0; 11 }
程序運行時,首先停下來,等你輸入一串字符串,輸入完畢后,它把你輸入的整個字符串都輸出來了,咦,你不是說getchar()只返回第一個字符么,這里怎么?
因為我們輸入的字符串並不是取了第一個字符就把剩下的字符串丟掉了,它還在我們的內存中,好比,開閘放水,我們把水放到閘里去以后,開一次閘就放掉一點,開一次就放掉一點,直到放光了為止,這里開閘動作就相當於調用一次getchar()。我們輸入的字符串也是這么一回事,首先我們輸入的字符串是放在內存的緩沖區中的,我們調用一次getchar()就把緩沖區中里出口最近的一個字符輸出,也就是最前面的一個字符輸出,輸出后,就把它釋放掉了,但后面還有字符串,所以我們就用循環把最前面的一個字符一個個的在內存中釋放掉,直到滿足循環條件退出為止。
例子中循環條件里的'\n '實際上就是你輸入字符串后的回車符,所以意思就是說,直到遇到回車符才結束循環,而getchar()函數就是等待輸入(或緩沖區中的數據)直到按回車才結束,所以實現了整個字符串的輸出。當然,我們也可以把循環條件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循環,當然意思是如果你輸入“12345a213123 ”那么只會輸出到a前面的那個字符,結果是12345。
