作者: 翁恺 单位: 浙江大学 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB
题目详情
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式:
输入在一行中给出一行文本,以.结束
提示:用scanf(“%c”,…);来读入一个字符,直到读到.为止。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It’s great to see you here.
输出样例:
4 5 2 3 3 4
本题注意与之前OJ平台上的 统计单词的不同,题目要求用scanf函数,且要逐个字符输入,所以不能用gets函数,且不能用字符型数组,因为题目中即没有整个字符串的长度限制,也没有单个单词的长度限制,而数组的不便之处就是定义是必须限制好确切的大小(除少数情况如:a[]=“asdf”)。
如果要单个字符输入,而前后输入的字符又有影响,如果定义多个字符型的简单变量,
1.不知道到底用几个;
2.在输入时带来诸多不便;
所以,可以先分析一下,单个输入所带来的前后的影响;
- List item
- 首先,题目中明确指出可能有多个连续的空格,不仅如此,还有一开始就输入空格的情况;
- 再就是连续输入,且规定结束标志位“.”,不是常规结束标志空格或回车;
- 还有,输入的其他字符只有“.”,不计数;
- 最后,每个长度之间以空格隔开,行末没有最后的空格;
对空格问题,我们可以用一个标记变量来标记空格的状态;
“.”的不计数,可以在计数前面加一个判断条件;
最后一条,我们可以先只输出单词长度,其后面的空格或回车先不输出,等到下一个非空格字符输入时进行判断,根据判断条件来输出空格或回车
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a;
int count = 0,flag = 0,n=0;
/*count为单词长度的标记变量,flag为输入
的是否为空格,n为是否输出了单词长度;*/
while(scanf("%c",&a))
{
if(a!=' '&&a!='.')
//计数的判断条件;
{
count++;
flag = 1;
//标记空格的状态;
}
else{
if(flag)
//如果是连续的第一个空格;
{
printf("%d",count);
count = 0;
//输出后初始化,用以新单词的计数;
flag = 0;
n=1;
//标记已经输出过单词长度;
}
}
if((flag&&n)||a=='.')
//输出单词长度后,输入了第一个非空格字符;
{
if(a!='.')
printf(" ");
else if(a=='.')
{
printf("\n");
break;
}
n = 0;
}
}
return 0;
}