鱼C论坛

 找回密码
 立即注册
查看: 784|回复: 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',这样,只要通过指针数组,就可以访问到每一个被分割出来的字符串。
#include<stdio.h>

#define MAX 1024

int main()
{
        char c , str[MAX] , * pos[MAX]                                                  ;
        int d , e , k , m                                                               ;
        printf("请输入一个英文句子:")                                                   ;
        for(m = 0 ; (c = getchar()) != '\n' && m < MAX ; str[m ++] = c , str[m] = '\0') ;
        printf("请输入分割符:")                                                         ;
        c = getchar()                                                                   ;
        for(d = 0 , e = 0 , k = 0 ; k < m ; k ++) {
                if(str[k] == c) {
                        str[k] = '\0'                                                   ;
                        e = 0                                                           ;
                } else {
                        if(! e) pos[d ++] = & str[k]                                    ;
                        e ++                                                            ;
                }
        }
        printf("现在依次打印每个单词:\n")                                               ;
        for(k = 0 ; k < d ; k ++) printf("%s\n" , pos[k])                               ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
请输入一个英文句子:23@23423@234@
请输入分割符:@
现在依次打印每个单词:
23
23423
234

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

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

#define MAX 1024

int main()
{
        char c , str[MAX] , * pos[MAX]                                                  ;
        int d , e , k , m                                                               ;
        printf("请输入一个英文句子:")                                                   ;
        for(m = 0 ; (c = getchar()) != '\n' && m < MAX ; str[m ++] = c , str[m] = '\0') ;
        printf("请输入分割符:")                                                         ;
        c = getchar()                                                                   ;
        for(d = 0 , e = 0 , k = 0 ; k < m ; k ++) {
                if(str[k] == c) {
                        str[k] = '\0'                                                   ;
                        e = 0                                                           ;
                } else {
                        if(! e) pos[d ++] = & str[k]                                    ;
                        e ++                                                            ;
                }
        }
        printf("现在依次打印每个单词:\n")                                               ;
        for(k = 0 ; k < d ; k ++) printf("%s\n" , pos[k])                               ;
}
        编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
请输入一个英文句子:23@23423@234@
请输入分割符:@
现在依次打印每个单词:
23
23423
234

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

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#define MAX 1024

int main()
{
        char str[MAX]={'\0'};
        char ch;
        int len = 0;
        int m = 0, t, i, j;

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

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

        t = 0;
        while(str[t]!='\0')
        {
            if (str[t]==ch)
                m++;
            t++;
        }

        char nStr[m+1][MAX];

        t = 0;
        i = 0;
        j = 0;
        while(str[t]!='\0')
        {
            if (str[t]==ch)
            {
                nStr[i][j] = '\0';
                i++;
                j=0;
            }
            else
            {
                nStr[i][j] = str[t];
                j++;
            }

            t++;
        }
        nStr[i][j] = '\0';

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

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

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 00:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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