7-26 单词长度
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.
结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's
算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.
不计算在内。
输入格式
输入在一行中给出一行文本,以.
结束
**提示:**用scanf("%c",...);
来读入一个字符,直到读到.
为止。
输出格式
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例
It's great to see you here.
输出样例
4 5 2 3 3 4
分析与答案
虽然涉及到字符串的题目一般会用string.h
中的函数处理,但这道题我还是采用了单链表的方式(其实是因为我对string.h
不熟),链表中记录的是各个单词的长度。
- 当输入既不为空格也不为句号时,记录单词长度的变量
count
就+1; - 当输入为空格时,如果此时
count
不为0,说明之前记录的单词长度还没有写进链表里,此时就要将变量写入链表并置零;如果这时count
为0,说明之前已经有空格打断过了,那就什么都不做。 - 当输入为句号时,如果此时
count
不为0,说明之前记录的单词长度还没有写进链表里,此时就要将变量写入链表并置零,同时结束链表;如果这时count
为0,说明句号前面有空格触发了置零(或者干脆什么都没有),此时将0写入链表并结束。在输出时,最后这个0不会被输出(题目并没有明说,但似乎没有单词的时候就是什么都不用输出的)
链表结束后,从头开始遍历一遍输出单词长度,注意空格添加的条件。
#include <stdio.h>
#include <stdlib.h>
struct wordLen {
int len;
struct wordLen *next;
};
typedef struct wordLen wordlen;
int main(){
int count = 0;
char c;
wordlen *res=NULL,*p=NULL;
res =(wordlen *)malloc(sizeof(wordlen));
p = res;
while(1){
scanf("%c",&c);
if(c=='.'){
if(count != 0){
//句号前有最后一个单词
res->len = count;
count = 0;
res->next = NULL;
}
else{
res->len = 0;
res->next = NULL;
}
break;
}
else{
if(c==' '){
if(count != 0){
//空格前有计数,否则什么都不做
res->len = count;
res->next = (wordlen*)malloc(sizeof(wordlen));
res = res->next;
count = 0;
}
}
else{
count++;
}
}
}
while(p!=NULL){
if(p->len!=0){
printf("%d",p->len);
if(p->next!=NULL&&p->next->len!=0)
printf(" ");
}
p = p->next;
}
return 0;
}