如何使用scanf输入带空格的字符串

学过字符串,我们都知道当输入一串带空格的字符
(通俗的说,就是英语中由一个个单词组成的一句话)时,举个例子,比如my name is aeiou
如果你用scanf直接输入的话,
像这样

 scanf("%s",str);

结果是这样的…

my

由运行结果我们可以看出,它遇到空格就停止读入了。
So 我们一般都选择用gets函数来读入一个带空格的字符串
就像这样

 gets(str);

运行出来是这样的

my name is aeiou

这是因为gets可以读入空格,遇到回车才会停止;而scanf遇到空格、回车和Tab键都会认为输入结束,所以它是不能接收空格的。
但是我们都知道gets是不安全的(尽管我现在还没有遇到过这种情况,但是C++认为gets是不安全的)
So 如果你想用scanf输入一个带空格的字符串的话,也不是不可以,下面就来说一下怎么用。
我们可以这样写

scanf("%[^\n]",str);

这样的话运行结果是

my name is aeiou

不要问为什么,记住这个[^\n]就行了,如果实在想知道的话可以去搜百度
但是你会发现一个问题
请看这个代码(这是一个统计元音字母的题的完整代码)

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    while(n--) 
    {
     char str[105];
     int f[5]={0};
     scanf("%[^\n]",str);
     int i;
     for(i=0;str[i]!='\0';i++)
     {
      
      if(str[i]=='a')
      {
       f[0]++;
   }
   else if(str[i]=='e')
   {
    f[1]++;
   }
   else if(str[i]=='i')
   {
    f[2]++;
   }
   else if(str[i]=='o')
   {
    f[3]++;
   }
   else if(str[i]=='u')
   {
    f[4]++;
   }
     }
  printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",f[0],f[1],f[2],f[3],f[4]);
  if(n!=0)
  {
   printf("\n");
  }
 }
 return 0;
}


你会发现运行结果是完全错误的,是不是满脑子充满了问号;其实真正的罪魁祸首就在于回车键,因为我们知道gets对末尾回车符的处理是接收回车并把回车替换为\0,而使用scanf时其会将末尾的回车符保留在缓存当中,所以在用其输入字符串时一定要加一个getchar去吃掉回车符,或者也可以用:

scanf("%[^\n]%*c",str);

这样运行结果也是正确的

  • 25
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值