鱼C论坛

 找回密码
 立即注册
查看: 1431|回复: 9

[已解决]S1E26动动手作业提问

[复制链接]
发表于 2021-10-9 12:34:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 软大头 于 2021-10-9 12:58 编辑

0. 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
要求:
返回的二维数组必须尽可能地节省空间(利用C语言的变长数组来实现)
不能使用现成的函数帮忙(你只能 #include <stdio.h>)
程序实现如下:
分割后的结果存放在 result 二维数组中,这个二维数组的尺寸是根据用户输入的单词长度而定的(再次提醒:不能使用 malloc 等没学过的知识噢~)
180230dg957cnk5zkcc55k.png

主要是我的指针还没学明白,然后就直接用数组做的,但是发现了个问题。
但是输入句子时直接打回车是不行的
bug1g.png
我发现句子末尾再加个空格然后再回车,就成功了
屏幕截图 2021-10-09 122837.png
这是我写的:
#include<stdio.h>
int main()
{
        int i=0,j=0,m=0,n=0;
        char ch;
        char str1[1024][1024];
        printf("请输入一个英文句子:");
        ch=getchar();
        while(ch!='\n')
        {
                for(j=0;;j++)
                {
                        if(ch!=' ')
                        {
                                str1[m][j]=ch;
                                n= n>j ? n:j ;
                        }
                        else
                        {
                                break;
                        }
                        ch=getchar();
                }
                ch=getchar();                        //为了让单词与单词之间的空格随意添加,我才想出了这个笨办法
                        while(ch==' ')
                {
                        ch=getchar();
                }
                m++;
        }
        n=n+2;                                  //加2是因为我让n等于j的最大数,而j是从0开始的,然后还要留出放'\0'的位置
        char str2[m][n];

(还一部分在2楼,因为那部分在帖子里看的时候字体莫名奇妙就变了,而且还少了好多)

大家帮我看看这是为啥啊?
还有我都学到这了还没感觉到指针的好处,写题先想到数组而不去用指针,是不是问题有点大了?

最佳答案
2021-10-9 15:08:52
来迟了
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i=0,j=0,k=0,m=0,n=0;
  5.     char ch;
  6.     char str1[1024][1024];
  7.     printf("请输入一个英文句子:");
  8.     ch=getchar();
  9.     while(ch!='\n')
  10.     {
  11.         for(j=0;;j++)
  12.         {
  13.             n = n>j ? n:j;
  14.             if(ch != ' ' && ch != '\n')
  15.             {
  16.                 str1[m][j]=ch;
  17.             }
  18.             else
  19.             {
  20.                 str1[m][j]= '\0';
  21.                 break;
  22.             }
  23.             ch=getchar();
  24.         }
  25.         if(ch == '\n') break;
  26.         ch=getchar();
  27.         while(ch==' ')
  28.         {
  29.             ch=getchar();
  30.         }
  31.         m++;
  32.     }
  33.     //n=n+2;
  34.     n=n+1;
  35.     m += 1;
  36.     char str2[m][n];
  37.     for (i = 0; i < m; i++)
  38.     {
  39.         j = 0;
  40.         while((str2[i][j] = str1[i][j])) ++j;
  41.         /*
  42.         for (j = 0; j < n; j++)
  43.         {
  44.             str2[i][j] = str1[i][j];
  45.         }
  46.         str2[i][j] = '\0';
  47.         */
  48.     }
  49.     printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
  50.     printf("现在依次打印每个单词:\n");
  51.     for (i = 0; i < m; i++)
  52.     {
  53.         printf("%s\n",str2[i]);
  54.     }
  55.     return 0;

  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-9 14:27:41 | 显示全部楼层
#include<stdio.h>
int main()
{
        int i=0,j=0,k=0,m=0,n=0;
        char ch;
        char str1[1024][1024];
        printf("请输入一个英文句子:");
        ch=getchar();
        while(ch!='\n')
        {
                for(j=0;;j++)
                {
                        if(ch!=' ')
                        {
                                str1[m][j]=ch;
                                n= n>j ? n:j ;
                        }
                        else
                        {
                                break;
                        }
                        ch=getchar();
                }
                ch=getchar();
                        while(ch==' ')
                {
                        ch=getchar();
                }
                m++;
        }
        n=n+2;
        char str2[m][n];
        for (i = 0; i < m; i++)
    {
            for (j = 0; j < n; j++)
        {
            str2[i][j] = str1[i][j];
        }
        str2[i][j] = '\0';
    }
        printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < m; i++)
    {
            printf("%s\n",str2[i]);
    }
        return 0;
       
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 12:57:35 | 显示全部楼层
本帖最后由 软大头 于 2021-10-9 14:25 编辑

for (i = 0; i < m; i++)
    {
            for (j = 0; j < n; j++)
        {
            str2[i][j] = str1[i][j];
        }
        str2[i][j] = '\0';
    }
        printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < m; i++)
    {
            printf("%s\n",str2[i]);
    }
        return 0;
}
(这是剩下的那部分)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 14:15:48 | 显示全部楼层
重新发一下代码吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 14:22:06 | 显示全部楼层
本帖最后由 软大头 于 2021-10-9 14:27 编辑

#include<stdio.h>
int main()
{
        int i=0,j=0,k=0,m=0,n=0;
        char ch;
        char str1[1024][1024];
        printf("请输入一个英文句子:");
        ch=getchar();
        while(ch!='\n')
        {
                for(j=0;;j++)
                {
                        if(ch!=' ')
                        {
                                str1[m][j]=ch;
                                n= n>j ? n:j ;
                        }
                        else
                        {
                                break;
                        }
                        ch=getchar();
                }
                ch=getchar();
                        while(ch==' ')
                {
                        ch=getchar();
                }
                m++;
        }
        n=n+2;
        char str2[m][n];
        for (i = 0; i < m; i++)
    {
            for (j = 0; j < n; j++)
        {
            str2[i][j] = str1[i][j];
        }
        str2[i][j] = '\0';
    }
        printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < m; i++)
    {
            printf("%s\n",str2[i]);
    }
        return 0;
       
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 14:23:42 | 显示全部楼层
本帖最后由 软大头 于 2021-10-9 14:27 编辑

for (i = 0; i < m; i++)
    {
            for (j = 0; j < n; j++)
        {
            str2[i][j] = str1[i]i[j];
        }
        str2[i][j] = '\0';
    }
        printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
        printf("现在依次打印每个单词:\n");
        for (i = 0; i < m; i++)
    {
            printf("%s\n",str2[i]);
    }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 14:24:19 | 显示全部楼层
软大头 发表于 2021-10-9 14:23
for (i = 0; i < m; i++)
    {
            for (j = 0; j < n; j++)

不知道为啥总是字体有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 14:28:59 | 显示全部楼层
软大头 发表于 2021-10-9 14:24
不知道为啥总是字体有问题

大大我在置顶里改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 15:07:45 | 显示全部楼层
  1. #include <stdio.h>

  2. int main(){
  3.     int m=0, n=0, max=0;
  4.     char ch;
  5.     char arr[1024][1024];
  6.     printf("请输入一个英文句子:");
  7.    
  8.     while(1){
  9.         ch = getchar();
  10.         if(ch == '\n') break;
  11.         else if(ch == ' '){
  12.             max = (max >= (n+1) ? max : n+1);
  13.             m++; n=0;
  14.         }
  15.         else arr[m][n++] = ch;
  16.     }
  17.    
  18.     max = (max >= (n+1) ? max : n+1);
  19.     char res[m+1][max];
  20.    
  21.     for(int i=0; i<=m; i++){
  22.         for(int j=0; j<max; j++){
  23.             if(arr[i][j]) res[i][j] = arr[i][j];
  24.             else res[i][j] = '\0';
  25.         }
  26.     }
  27.     printf("分割结果已存放到result[%d][%d]的二维数组中...\n现在依次打印每个单词:\n", m+1, max);
  28.     for (int i=0; i<=m; i++){
  29.         for(int j=0; j<max; j++) printf("%c", res[i][j]);
  30.         printf("\n");
  31.     }
  32.     return 0;
  33. }
复制代码
  1. 请输入一个英文句子:asd asd sdf; lsdfk
  2. 分割结果已存放到result[4][6]的二维数组中...
  3. 现在依次打印每个单词:
  4. asd
  5. asd
  6. sdf;
  7. lsdfk
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
软大头 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 15:08:52 | 显示全部楼层    本楼为最佳答案   
来迟了
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i=0,j=0,k=0,m=0,n=0;
  5.     char ch;
  6.     char str1[1024][1024];
  7.     printf("请输入一个英文句子:");
  8.     ch=getchar();
  9.     while(ch!='\n')
  10.     {
  11.         for(j=0;;j++)
  12.         {
  13.             n = n>j ? n:j;
  14.             if(ch != ' ' && ch != '\n')
  15.             {
  16.                 str1[m][j]=ch;
  17.             }
  18.             else
  19.             {
  20.                 str1[m][j]= '\0';
  21.                 break;
  22.             }
  23.             ch=getchar();
  24.         }
  25.         if(ch == '\n') break;
  26.         ch=getchar();
  27.         while(ch==' ')
  28.         {
  29.             ch=getchar();
  30.         }
  31.         m++;
  32.     }
  33.     //n=n+2;
  34.     n=n+1;
  35.     m += 1;
  36.     char str2[m][n];
  37.     for (i = 0; i < m; i++)
  38.     {
  39.         j = 0;
  40.         while((str2[i][j] = str1[i][j])) ++j;
  41.         /*
  42.         for (j = 0; j < n; j++)
  43.         {
  44.             str2[i][j] = str1[i][j];
  45.         }
  46.         str2[i][j] = '\0';
  47.         */
  48.     }
  49.     printf("分割结果已存放到result[%d][%d]的二维数组中...",m,n);
  50.     printf("现在依次打印每个单词:\n");
  51.     for (i = 0; i < m; i++)
  52.     {
  53.         printf("%s\n",str2[i]);
  54.     }
  55.     return 0;

  56. }
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
软大头 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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