首页 新闻 会员 周边

C语言分词去重,没豆了求个解答

0
悬赏园豆:10 [已解决问题] 解决于 2021-12-11 22:46

【题目描述】
输入一个仅包含小写字母、大写字母和空格的字符串,一段只包含小写字母和大写字母的字符串为一个单词,其中每个单词用空格隔开。要求编写一段程序,将所有单词保存到一个字符指针数组中,重复的单词只保存一个,并输出拆分的单词。
【输入说明】
字符串长度小于200。单次总数不多于100,每个单词长度小于20。
【输出说明】
按输入时从左到右单词出现的顺序进行输出。每个单词独立一行。
【输入样例】
good luck
【输出样例】
good
luck

include <stdio.h>

include <string.h>

void main()
{
char x[200];
gets (x);
char *y[200];
int i=0,n;
y[0]=strtok(x," ");
while (y[i])
{
i++;
y[i]=strtok(NULL," ");
}
n=i;
for (i=0;i<n;i++)
printf ("%s\n",y[i]);
}

题里说重复单词去重,这个函数可以做到吗?该怎么做?

wedy1234的主页 wedy1234 | 初学一级 | 园豆:6
提问于:2021-12-11 20:10
< >
分享
最佳答案
1

这个函数是不能做到的,需要和之前的比较字符串才能判决,鉴于你的豆豆都被我一会儿搞走了,给你个参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char x[200];
    char *token;
    char *tokens[100]; //最多100个单词
    gets(x);
    int counter = 0;
    token = strtok(x, " ");

    //先存储打印第一个,因为第一个不可能有重复
    tokens[counter] = token;
    puts(token);
    counter++;

    while (1)
    {
        // 获取下一个字符串,如果空说明没了,该跳出了
        token = strtok(NULL, " ");
        if (token == NULL)
        {
            break;
        }

        // 判断之前有没有
        unsigned char hascontained = 0;
        for (int i = 0; i < counter; i++)
        {
            if ( strcmp(tokens[i],token) == 0)
            {
                hascontained = 1;
                break;
            }                   
        }
        
        //如果有,就不加入保存列表,直接下一步循环
        if(hascontained)
            continue;

        //如果是新单词,加入保存列表,打印继续
        tokens[counter] = token;
        counter++;
        puts(token);
    }

    system("pause");
    return 0;
}

对于C语言这个东西,很多东西需要自己写的,如果库函数没有,就得自己写。

收获园豆:10
寂静的羽夏 | 小虾三级 |园豆:1781 | 2021-12-11 22:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册