1 题目要求
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式:
输入在一行中给出一行文本,以.结束
提示:用scanf("%c",…);来读入一个字符,直到读到.为止。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
2 样例
输入样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4
3 分析
题目中要求使用scanf(),限定C语言。
- 计算每个单词的长度并输出,前后单词没有关联,单词长度无需存储,所以使用一个变量wordLen来保存每个单词的长度,遇到空格时,单词长度清零。 遇到.,时结束读取。
-
单词之间可能有多个空格,而只在前一个单词结束,遇到第一个空格时输出单词长度,之后的空格不作处理,所以需要一个变量来记录空格是否连续出现isContinueSpace,借鉴题目 链接: 7-23 币值转换.中的zeroContinue 在下一次循环时,更新zeroContinue前,访问zeroContinue,其实就是访问上一位是否为0.实现连续0的判断。 来实现该变量。
——isContinueSpace -
状态变化0–1 1–0,
– 0–1 在单词后首次遇到空格 ,输出单词长度后
– 1–0,在遇到. 后,以及在遇到单词时
- 第一个单词的前面的空格需要注意,否则不加另外的控制会输出0,——在首次遇到空格(isSpaceContinue==0)时,需要再检查单词长度不为0,才能输出
- 在提交测试时,空句子答案错误,——空句子指只有一个 .的句子,遇到空句子应该什么也不输出。所以,也需要判断wordLen不为0的情况下才输出
- 每个单词长度值右边空格的控制,借鉴 7-27 念数字 中的 leftHastSpace,
空格的控制,实际上是当前遍历到的数字对应的字符串左侧是否有空格——第一个读到的符号左侧没有空格,剩下的都有
定义isFirstWord——
- ,初始值应该为1,因为读到第一个满足条件的单词,肯定是FirstWord
- 状态变化 1–0,
- 1–0,位置:第一个单词输出结束后
4 代码
#include <stdio.h>
int main()
{
char ch=0;
int wordLen=0;
int isSpaceContinue=0,isFirstWord=1; //1--0
while(scanf("%c",&ch)!=EOF)
{
if(ch=='.')
{
if(wordLen!=0)
{
if(isFirstWord==0)
printf(" ");
printf("%d",wordLen);
}
if(isSpaceContinue==1)
isSpaceContinue=0;
isFirstWord=0;
break;
}
else
{
if(ch==' ')
{
if(isSpaceContinue==0&&wordLen!=0)
{
if(isFirstWord==0)
printf(" ");
printf("%d",wordLen);
wordLen=0;
if(isFirstWord==1)
isFirstWord=0;
if(isSpaceContinue==0)
isSpaceContinue=1;
}
}
else
{
wordLen++;
if(isSpaceContinue==1)
isSpaceContinue=0;
}
}
}
return 0;
}
5 总结
(1) 连续同字符出现的判断
(2)每空一格输出一个字符,最后一个字符右侧不空格的方法
(3)连续输入字符