当前位置:   article > 正文

scanf函数使用%s与%c时容易出现的错误_scanf %s

scanf %s

先来看一个例子

输入:

5

a abc

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n;
  6. scanf("%d",&n);
  7. char flag;
  8. char str[27];
  9. scanf("%c",&flag);
  10. scanf("%s",&str);
  11. cout<<flag<<endl;
  12. cout<<str<<endl;
  13. return 0;
  14. }

输出:

  1. abc//上面为两个换行符

这里面由于scanf函数不能接受空格、制表符Tab、回车等,所以第一个scanf函数没有读入数字5后面的回车符,而是将该回车符放在了缓冲区里。scanf("%c",&flag)首先读取的是缓冲区的回车符,所以会导致flag的值不是我们想要的a。

我的一种正确写法:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int n;
  6. scanf("%d",&n);
  7. char flag[2];
  8. char str[27];
  9. scanf("%s",&flag);
  10. scanf("%s",&str);
  11. cout<<flag<<endl;
  12. cout<<str<<endl;
  13. return 0;
  14. }

我们想要的输出:

  1. a
  2. abc

这里利用了scanf函数的格式控制符%s不会读取空白字符(一般包含空格、回车符、制表符等)的性质,也就是说scanf函数在使用%s进行格式控制的时候,是以空白字符为结束标志的。所以flag字符串不会读取scanf函数缓冲区的回车符,同理str字符串也不会读取a后面空格符。

 我们也可以用这个性质,避免在输入字符+空格符+字符串时,错误地将空格符读取进后面的字符串。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号