Scanf的陷阱,遇到空格怎么办

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这是牛客网上的一道简单编程题,

输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。


`

一、输入的陷阱

大家很容易就想到使用scanf进行输入,但是最终输出的结果总是错误的,问题原因就出现在scanf和空格之间的关系。scanf如果遇到空格后就会停止扫描,这和我们一厢情愿认为的字符串的结尾是’\0’,它肯定会扫描到’\0’有所差异。
在这里插入图片描述
可以看到,这里只输出了abcd 后面的efg并未被scanf扫描到。

如果使用gets这个函数获得标准输入流(键盘)上的字符串的话就不会出现这种问题。
在这里插入图片描述

二、题目解法

1.正解

代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
    char str[5000] = { 0 };
    gets(str);

    int i = 0;
    int count = 0;
    while (*(str + i) != '\0')
    {
        i++;
    }

    while (*(str + i) != ' '&&i >= 0)
    {
        count++;
        i--;
    }
  
    printf("%d", count-1);
    return 0;
}

这里使用的是gets这个函数,因为字符串中含有空格,如果使用scanf的话,字符串输入进去都不对,何谈后面的处理是正确的呢

2.使用scanf(“%[^\n]”,str)形式

这种形式的意思是遇到\n结束。
我们想要让它遇到’\0’停止,那么只需要将scanf(“%s”,str)换为scanf(“%[^\n]”,str)
在这里插入图片描述


总结

这其实是scanf的一个陷阱,一不小心掉进去的话,就很难发现其中的错误

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值