鱼C论坛

 找回密码
 立即注册
查看: 2838|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

  18.         int i; // 给 for 循环用

  19.         printf ("请输入:");
  20.         scanf ("%d", &n);
  21.         getchar ();
  22.         c = n;

  23.         //接收输入
  24.         while (c--)
  25.         {
  26.                 fgets(str_tmp, 100, stdin);
  27.                 Remove_the_newline_character (str_tmp);

  28.                 strcpy (p,str_tmp);
  29.                 p += strlen(str_tmp) + 1;
  30.         }

  31.         //转换
  32.         strToWord (strBuff, n, wordBuff);

  33.         //计算并打印

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

  38.         return(0);
  39. }

  40. void Remove_the_newline_character(char str[])
  41. {
  42.         int tmp;
  43.         char *p;
  44.        
  45.         p = str + strlen(str) -1;
  46.         *p = '\0';
  47. }

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

  58.         for (i = 0; i < n; i++)
  59.         {
  60.                 w_p = 1; //复位, 从1开始保留0 , 0存放个数
  61.                 count = 0; //复位
  62.                 p_len = strlen (p);
  63.                 for (k = 0; k < p_len; k++)
  64.                 {
  65.                         if (*p != ' ')
  66.                         {
  67.                                 wordBuff[i][w_p++] = *p;
  68.                                 p++;
  69.                
  70.                         }
  71.                         else
  72.                         {
  73.                                 wordBuff[i][w_p++] = '\0'; //把每个转换后的单词便为字符串
  74.                                 p++;

  75.                                 count++;
  76.                         }
  77.                 }
  78.                
  79.                 wordBuff[i][w_p++] = '\0'; // 为最后一次加 '\0'
  80.                 count++; // 加上最后一个
  81.                 wordBuff[i][0] = count;
  82.                 p++; // 使 p 指向下一个字符串

  83.         }
  84. }

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

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

  96.         for (i = 0; i < t; i++)
  97.         {
  98.                 for (k = 0; k < t - i; k++)
  99.                 {
  100.                         if (i == 0) //只有第一次才 加 ,其他都 减
  101.                         {
  102.                                 if (strcmp(p1, p2) != 0) //找不同
  103.                                 {
  104.                                         count++;

  105.                                 }
  106.                         }
  107.                         else
  108.                         {
  109.                                 if (strcmp(p1, p2) == 0) //找相同
  110.                                 {
  111.                                         count--;

  112.                                 }
  113.                         }

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

  116.                 p1 += strlen (p1) + 1; // p1 指向下一个
  117.                 p2 = p1;
  118.                 p2 += strlen(p1) + 1; // p2 复位
  119.         }

  120.         return count;

  121. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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