赞
踩
先来看一个例子
输入:
5
a abc
- #include<iostream>
- using namespace std;
- int main()
- {
- int n;
- scanf("%d",&n);
- char flag;
- char str[27];
- scanf("%c",&flag);
- scanf("%s",&str);
- cout<<flag<<endl;
- cout<<str<<endl;
- return 0;
- }
输出:
-
-
- abc//上面为两个换行符
这里面由于scanf函数不能接受空格、制表符Tab、回车等,所以第一个scanf函数没有读入数字5后面的回车符,而是将该回车符放在了缓冲区里。scanf("%c",&flag)首先读取的是缓冲区的回车符,所以会导致flag的值不是我们想要的a。
我的一种正确写法:
- #include<iostream>
- using namespace std;
- int main()
- {
- int n;
- scanf("%d",&n);
- char flag[2];
- char str[27];
- scanf("%s",&flag);
- scanf("%s",&str);
- cout<<flag<<endl;
- cout<<str<<endl;
- return 0;
- }
我们想要的输出:
- a
- abc
这里利用了scanf函数的格式控制符%s不会读取空白字符(一般包含空格、回车符、制表符等)的性质,也就是说scanf函数在使用%s进行格式控制的时候,是以空白字符为结束标志的。所以flag字符串不会读取scanf函数缓冲区的回车符,同理str字符串也不会读取a后面空格符。
我们也可以用这个性质,避免在输入字符+空格符+字符串时,错误地将空格符读取进后面的字符串。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。