提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这是牛客网上的一道简单编程题,
输入描述:
输入一行,代表要计算的字符串,非空,长度小于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的一个陷阱,一不小心掉进去的话,就很难发现其中的错误