字符的输入
getchar()
features:
- 输入一个字符,并以回车键提交
- 可以接收空格、tab、回车
- 当输入
a[回车]
时,getchar()接受‘a’,但会把[回车]符留在缓冲区。
example1
code:
#include<iostream>
using namespace std;
int main(){
char ch;
int i=1;
while(ch = getchar()){
cout<<i<<":"<<(int)ch<<endl;
++i;
}
return 0;
}
input:
- (空格)abc(制表符tab)d(回车)
output:
- 1:32
1:97
1:98
1:99
1:9
1:100
1:10
scanf()
feature:
- scanf("%c",&ch)可以接收空格、tab、回车
- 有两种使用方法,方法一 scanf("%c%c",&a,&b) 和 方法二 scanf(" %c %c",&a,&b)。
- 方法一scanf会将键盘录入的任何一个键入都作为录入,多余的部分留在缓冲区。
- 方法二跟scanf输入数值类型的情况相同,scanf从第一个 非空格/回车/tab 字符开始录入。
example1(方法一易错点):
problem description:
输入一个数字n,接下来输入n组数据,每组两个字符,每输入一组数据则输出这组数据,每组输出占一行
wrong code:
#include<iostream>
using namespace std;
int main(){
int n;
char a,b;
scanf("%d",&n);
while(n>0){
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
--n;
}
return 0;
}
input:
- 4
ab
cd
ef
output(including input content):
cause of error:
- scanf("%d",&n);中,我们输入了4[回车],其中4被读取,[回车]还留在缓存区中
- 在随后的scanf("%c%c",&a,&b);中,[回车]赋予了a,字符‘a’赋予了b
the way to solve the problem:
method 1:
- use
scanf(" %c %c",&a,&b);
to replacescanf("%c%c",&a,&b);
method 2:
- insert
getchar()
under everyscanf()
#include<iostream>
using namespace std;
int main(){
int n;
char a,b;
scanf("%d",&n);
getchar();
while(n>0){
scanf("%c%c",&a,&b);
getchar();
printf("%c%c\n",a,b);
--n;
}
return 0;
}
cin(C++):
feature:
- 当从缓冲区取出空格符、回车符、制表符tab会自动舍弃
- cin>>a;
scanf("%c",&b);
这时输入a[回车],‘a’会赋予a,[回车]仍会赋予b