今天做TJU的OJ ,其中一道题是先读入一个字符串,再读入一个整数,循环往复,直到字符串是空,也就是说回车键结束循环。
但是cin对空格和回车都不敏感,都不影响继续读入数据,所以需要一种新的方式检测回车。
方法一:利用getchar()函数
1 //**************************将输入的单词逆序输出*************************// 2 #include3 #include 4 #include 5 #include 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() == ' ') //检测如果是空格,退出循环; 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())!=' ') //每个getchar()依次读入一个字符 7 printf("%c",c); //按照原样输出 8 printf(" "); 9 system("pause"); 10 return 0; 11 }
程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这里怎么?
因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到满足循环条件退出为止。
例子中循环条件里的' '实际上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循环,当然意思是如果你输入“12345a213123 ”那么只会输出到a前面的那个字符,结果是12345。