7-26 单词长度

你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。

输入格式

输入在一行中给出一行文本,以.结束

**提示:**用scanf("%c",...);来读入一个字符,直到读到.为止。

输出格式

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例

It's great to see you here.

输出样例

4 5 2 3 3 4

分析与答案

虽然涉及到字符串的题目一般会用string.h中的函数处理,但这道题我还是采用了单链表的方式(其实是因为我对string.h不熟),链表中记录的是各个单词的长度。

  1. 当输入既不为空格也不为句号时,记录单词长度的变量count就+1;
  2. 当输入为空格时,如果此时count不为0,说明之前记录的单词长度还没有写进链表里,此时就要将变量写入链表并置零;如果这时count为0,说明之前已经有空格打断过了,那就什么都不做。
  3. 当输入为句号时,如果此时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;
}

7-26 测试点