题目描述:
描述
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
输入描述:
在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 。
输出描述:
在一行上输出一个整数,代表最后一个单词的长度。
示例
输入 | 输出 | 描述 |
---|---|---|
HelloNowcoder | 13 | 最后一个单词是 ‘HelloNowcoder’,长度为 13 |
A B C D | 1 | 最后一个字符为‘D’,则输出为1 |
特别注意:
社区讨论中,大家提出了输入字符串尾端为空格的情况,确实需要额外讨论。
如:‘I am a student’ 句子中。结尾没有空格,可以进行简单算法计算。
如:‘I am acturally not human ’ 句子中,结尾出现了两个空格,则可能需要额外讨论。
分析与解题思路:
①简单版(考虑结尾空格):
用循环接收字符,在开始时开始计数,检测到空格的时候重新计数,计数为非空格输入量,最后计数的值就是最后一个单词的长度。
//最简单的方法就是,根本就不需要存储字符串,直接单个字符循环输入并计数
//直接计算长度就可以了,也不需要动态的复杂的数据结构
#include <stdio.h>
int main()
{
char ch;
int n = 0;
int flag = 0;
while(1)
{
ch = getchar(); //每一个字符单独输入
if(ch == '\n') //检测回车,输入结束,跳出循环
{
break;
}
else if(ch != ' ') //检测到不是空格,则开始计数
{
if(flag == 0)
{
n = 0;
flag = 1;
}
n++;
}
else //检测到空格,则不计数,并把标志置零
{
flag = 0;
}
}
printf("%d\n", n); //最后得到最后一个单词所含字符数为:n
return 0;
}
输入'I am a student' ,输出为7
输入‘ I am a student ’(结尾带空格),输出为也7
②数组版(倒序查询,考虑结尾空格)
该函数中,无论最后有咩有空格输入,数组最后一位存的都是‘\n’这个字符,所以计算末尾位置的时候需要跳过。
而当只有一个单词或字母输入的时候,行18的while会将j减到负值,出现word[-1]的错误情况,为了避免,在下一行规定 j 的值不能小于0。
#include <stdio.h>
#define MAX 1000 // 最大长度
int main()
{
int i,j,n; // n用来计数
char word[MAX];
i = j = n = 0;
while((word[i]=getchar()) != '\n')
i++ ;
while( word[i] == ' '|| word[i]=='\n')
i-- ; // 找到字符串非空格的末尾,回车也跳
j = i ;
while( word[j] != ' ') // 找到末尾单词的字头的前一个空格
{
if (j==0) //当输入只有一个单词时候,特别讨论
{
j--;
break;
}
j-- ;
}
n = i-j ;
printf("%d\n",n);
}
③字符串版(倒序查询,考虑结尾空格)
和数组版类似,只不过输入输出改为字符串的形式。
#include <stdio.h>
#define MAX 1000 // 最大长度
int main()
{
int i,j,n; // n用来计数
i=j=n=0;
char word[MAX];
gets(word);
for(;word[i]!='\0';i++); //找到字符串的末尾
while( word[i] == ' '|| word[i]=='\0')
i-- ; // 找到字符串非空格的末尾,回车也跳
j = i ;
while( word[j] != ' ') // 找到末尾单词的字头的前一个空格
{
if (j==0) //当输入只有一个单词时候,特别讨论
{
j--;
break;
}
j-- ;
}
n = i-j ;
printf("%d\n",n);
}