鱼C论坛

 找回密码
 立即注册
查看: 2321|回复: 1

有关这个题如何输入和存储字符串

[复制链接]
发表于 2016-1-3 11:35:53 | 显示全部楼层 |阅读模式
10鱼币

Description



题目描述

犹豫良久之后,bob痛下决心要考研。作为一个合格的考研er,bob很早就来到了一教, 拿出精心准备的考研必备神器--考研英语单词表!在看到单词表那一串串长长的英语词组时, 他顿时感到无力。请你帮忙统计一下,每一串英语词组中有多少个不重复的单词出现,然后把数目告诉bob, 让他不要灰心。

输入

数据的第一行为一个整数k,1 ≤ k ≤ 1000,表示测试用例的个数。以后每行是一串字符(长度不超过1100), 字符只有小写字母和空格组成,不会出现纯空格,单词之间可能存在多个空格。

输出

输出每一串不重复的单词个数,每个用例输出一行。

样例输入
2
life is but once so cherish your life
no pains   no gains


样例输出
7
3


主要是怎么输入和保存字符串

最佳答案

查看完整内容

注:程序对空格特别敏感,测试时要多留意 程序写的不好,请多包涵 程序不敢保证没有问题,只是简单测试了几下,应该还有bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-3 11:35:54 | 显示全部楼层
#include <stdio.h>
#include <string.h>

void Remove_the_newline_character (char str[]);
void strToWord (char str[], // 字符串地址
        int n, //指str中字符串的个数
        char wordBuff[][100] // 单词(字符串)地址 
        );
int compare (char str[]); //比较 一个字符串中不重复的单词个数并返回

int main()
{
        char str_tmp[100]; //用于临时存放字符串

        char strBuff[100]; //用来存放所有字符串
        char *p = strBuff; //p 指向 strBuff 中的字符串

        char wordBuff[100][100]; //转换后字符串变为单词(字符串)存放在此, 每个二维数组的第二维的第一个存放后面的字符串个数
        
        int n; //用于接收开始的数字
        int c; //临时的

        int i; // 给 for 循环用

        printf ("请输入:");
        scanf ("%d", &n);
        getchar ();
        c = n;

        //接收输入
        while (c--)
        {
                fgets(str_tmp, 100, stdin);
                Remove_the_newline_character (str_tmp);

                strcpy (p,str_tmp);
                p += strlen(str_tmp) + 1;
        }

        //转换
        strToWord (strBuff, n, wordBuff);

        //计算并打印

        for (i =0; i < n; i++)
        {
                printf ("%d\n", compare (&wordBuff[i][0]));
        }

        return(0);
}

void Remove_the_newline_character(char str[])
{
        int tmp;
        char *p;
        
        p = str + strlen(str) -1;
        *p = '\0';
}

void strToWord(char str[], // 字符串地址
        int n, //指str中字符串的个数
        char wordBuff[][100] // 单词地址 
        )
{
        char *p = str;
        int w_p; //指向 wordBuff 二维数组的第二维
        int i, k;
        int p_len;
        int count = 0; //统计字符串的个数

        for (i = 0; i < n; i++)
        {
                w_p = 1; //复位, 从1开始保留0 , 0存放个数
                count = 0; //复位
                p_len = strlen (p);
                for (k = 0; k < p_len; k++)
                {
                        if (*p != ' ')
                        {
                                wordBuff[i][w_p++] = *p;
                                p++;
                
                        }
                        else
                        {
                                wordBuff[i][w_p++] = '\0'; //把每个转换后的单词便为字符串
                                p++;

                                count++;
                        }
                }
                
                wordBuff[i][w_p++] = '\0'; // 为最后一次加 '\0'
                count++; // 加上最后一个
                wordBuff[i][0] = count;
                p++; // 使 p 指向下一个字符串

        }
}

int compare(char str[]) //比较 一个字符串中不重复的单词个数并返回
{
        char *p1 = str;
        char *p2 = str;
        int t = *p1; // str 中第一个是后面字符串的个数
        int i, k;
        int count = 1; // 第一个字符串先算上

        t--; // t是字符串个数, 需要减一
        p1++; //p1 指向第一个字符串
        p2++;
        p2 += strlen (p1) + 1;

        for (i = 0; i < t; i++)
        {
                for (k = 0; k < t - i; k++)
                {
                        if (i == 0) //只有第一次才 加 ,其他都 减
                        {
                                if (strcmp(p1, p2) != 0) //找不同
                                {
                                        count++;

                                }
                        }
                        else
                        {
                                if (strcmp(p1, p2) == 0) //找相同
                                {
                                        count--;

                                }
                        }

                        p2 += strlen (p2) + 1; // 指向下一个
                }

                p1 += strlen (p1) + 1; // p1 指向下一个
                p2 = p1;
                p2 += strlen(p1) + 1; // p2 复位
        }

        return count;

}

注:程序对空格特别敏感,测试时要多留意
程序写的不好,请多包涵
程序不敢保证没有问题,只是简单测试了几下,应该还有bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 18:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表