鱼C论坛

 找回密码
 立即注册
查看: 1043|回复: 2

[已解决]分隔单词

[复制链接]
发表于 2020-3-11 21:49:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>

#define MAX 1024

int main()
{
        char str[MAX];
        char *p = str;
        char *pos[MAX];
        char ch;
        int len = 0;
        int cchar = 0, cword = 0;
        int max = 0,i = 0, j;
       
        printf("请输入一个英文句子:");
        while ((str[len++] = getchar()) != '\n' && len < 1024)
                ;
        len -= 2;
       
        printf("请输入分割符:");
        scanf("%c",&ch);
       
        if (*p != ch)
        {
                cword++;
                cchar++;
                pos[i++] = p;
                len--;
                p++;//放在里面,只有第一个指针用过了才指向下一个
        }
       
        while (len--)
        {
                if (*p++ == ch)
                {
                        max = cchar > max ? cchar : max;
                        cchar = 0;
                       
                        if (*p != ch)
                        {
                                cword++;
                                pos[i++] = p;
                        }
                }
                else
                {
                        cchar++;
                }
        }
        max = cchar > max ? cchar : max;
       
        char result[cword][max+1];
       
        for (i = 0;i < cword;i++)
        {
                for (j = 0;*(pos[i]+j) != ch;j++)
                {
                        result[i][j] = *(pos[i]+j);
                }
                result[i][j] = '\0';
        }
        printf("分割结果已存放到result[%d][%d]的二维数组中...",cword,max+1);
       
        printf("现在依次打印每个单词:\n");
        for (i = 0;i < cword;i++)
        {
                printf("%s\n",result[i]);
        }
       
        return 0;
}

请输入一个英文句子:23@23423@234
请输入分割符:@

--------------------------------
Process exited after 17.33 seconds with return value 3221225477
请按任意键继续. . .

好像出现问题了,是代码错了?
最佳答案
2020-3-11 22:19:41
本帖最后由 jackz007 于 2020-3-11 22:56 编辑

        采用二维字符数组来保存分割好的字符串有个问题,二维数组的每一行都是等长的,要求这个行长度必须能够容纳被分割出来最长的字符串,所以,这个长度很重要。但是,我们事先并不知道这个长度的合适值,如果设置小了肯定会导致下标越界,如果设置长了,会非常浪费存储空间。
        在这里,我们不考虑把分割好的字符串存入另一个二维字符数组,而是采用字符指针数组记录每个字符串在 str[] 中的开头,然后,把分隔符直接改成字符串结束符 '\0',这样,只要通过指针数组,就可以访问到每一个被分割出来的字符串。
  1. #include<stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char c , str[MAX] , * pos[MAX]                                                  ;
  6.         int d , e , k , m                                                               ;
  7.         printf("请输入一个英文句子:")                                                   ;
  8.         for(m = 0 ; (c = getchar()) != '\n' && m < MAX ; str[m ++] = c , str[m] = '\0') ;
  9.         printf("请输入分割符:")                                                         ;
  10.         c = getchar()                                                                   ;
  11.         for(d = 0 , e = 0 , k = 0 ; k < m ; k ++) {
  12.                 if(str[k] == c) {
  13.                         str[k] = '\0'                                                   ;
  14.                         e = 0                                                           ;
  15.                 } else {
  16.                         if(! e) pos[d ++] = & str[k]                                    ;
  17.                         e ++                                                            ;
  18.                 }
  19.         }
  20.         printf("现在依次打印每个单词:\n")                                               ;
  21.         for(k = 0 ; k < d ; k ++) printf("%s\n" , pos[k])                               ;
  22. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 请输入一个英文句子:23@23423@234@
  4. 请输入分割符:@
  5. 现在依次打印每个单词:
  6. 23
  7. 23423
  8. 234

  9. C:\Bin>x
  10. 请输入一个英文句子:@23@@23423@@@234@@5
  11. 请输入分割符:@
  12. 现在依次打印每个单词:
  13. 23
  14. 23423
  15. 234
  16. 5

  17. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 22:19:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-11 22:56 编辑

        采用二维字符数组来保存分割好的字符串有个问题,二维数组的每一行都是等长的,要求这个行长度必须能够容纳被分割出来最长的字符串,所以,这个长度很重要。但是,我们事先并不知道这个长度的合适值,如果设置小了肯定会导致下标越界,如果设置长了,会非常浪费存储空间。
        在这里,我们不考虑把分割好的字符串存入另一个二维字符数组,而是采用字符指针数组记录每个字符串在 str[] 中的开头,然后,把分隔符直接改成字符串结束符 '\0',这样,只要通过指针数组,就可以访问到每一个被分割出来的字符串。
  1. #include<stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char c , str[MAX] , * pos[MAX]                                                  ;
  6.         int d , e , k , m                                                               ;
  7.         printf("请输入一个英文句子:")                                                   ;
  8.         for(m = 0 ; (c = getchar()) != '\n' && m < MAX ; str[m ++] = c , str[m] = '\0') ;
  9.         printf("请输入分割符:")                                                         ;
  10.         c = getchar()                                                                   ;
  11.         for(d = 0 , e = 0 , k = 0 ; k < m ; k ++) {
  12.                 if(str[k] == c) {
  13.                         str[k] = '\0'                                                   ;
  14.                         e = 0                                                           ;
  15.                 } else {
  16.                         if(! e) pos[d ++] = & str[k]                                    ;
  17.                         e ++                                                            ;
  18.                 }
  19.         }
  20.         printf("现在依次打印每个单词:\n")                                               ;
  21.         for(k = 0 ; k < d ; k ++) printf("%s\n" , pos[k])                               ;
  22. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 请输入一个英文句子:23@23423@234@
  4. 请输入分割符:@
  5. 现在依次打印每个单词:
  6. 23
  7. 23423
  8. 234

  9. C:\Bin>x
  10. 请输入一个英文句子:@23@@23423@@@234@@5
  11. 请输入分割符:@
  12. 现在依次打印每个单词:
  13. 23
  14. 23423
  15. 234
  16. 5

  17. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 22:32:37 | 显示全部楼层
代码是怎么看怎么复杂。我改了下。
  1. #include<stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str[MAX]={'\0'};
  6.         char ch;
  7.         int len = 0;
  8.         int m = 0, t, i, j;

  9.         printf("请输入一个英文句子:");
  10.         while ((str[len++] = getchar()) != '\n' && len < 1024);
  11.         str[len] = '\0';

  12.         printf("请输入分割符:");
  13.         scanf("%c",&ch);

  14.         t = 0;
  15.         while(str[t]!='\0')
  16.         {
  17.             if (str[t]==ch)
  18.                 m++;
  19.             t++;
  20.         }

  21.         char nStr[m+1][MAX];

  22.         t = 0;
  23.         i = 0;
  24.         j = 0;
  25.         while(str[t]!='\0')
  26.         {
  27.             if (str[t]==ch)
  28.             {
  29.                 nStr[i][j] = '\0';
  30.                 i++;
  31.                 j=0;
  32.             }
  33.             else
  34.             {
  35.                 nStr[i][j] = str[t];
  36.                 j++;
  37.             }

  38.             t++;
  39.         }
  40.         nStr[i][j] = '\0';

  41.         printf("分割结果已存放到result[%d][%d]的二维数组中...",m+1,MAX);

  42.         printf("现在依次打印每个单词:\n");
  43.         for (i = 0;i < m+1;i++)
  44.         {
  45.                 printf("%s\n",nStr[i]);
  46.         }

  47.         return 0;
  48. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 04:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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