鱼C论坛

 找回密码
 立即注册
查看: 3061|回复: 23

[已解决]s1e26动动手第0题,为什么不能正确输出?

[复制链接]
发表于 2022-10-2 22:16:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 顶级太阳 于 2022-10-2 22:17 编辑

题目要求如下:

0. 分割字符串。用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
要求:
返回的二维数组必须尽可能地节省空间(利用C语言的变长数组来实现)
不能使用现成的函数帮忙(你只能 #include <stdio.h>)

程序实现如下:
分割后的结果存放在 result 二维数组中,这个二维数组的尺寸是根据用户输入的单词长度而定的(再次提醒:不能使用 malloc 等没学过的知识噢~)
题目图片1.png
不论是一个空格还是多个空格,你的程序都能够正确识别出单词来:
题目图片2.png


我的代码:
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a[2]={0};
  5. char *p=a;
  6. char ch;
  7. int m=1,n=1;
  8. int i=1,j=1;

  9. printf("请输入一个英文句子:");
  10. while((ch=getchar())!='\n')
  11. {
  12.         if(ch!=32)
  13.         {
  14.                 *(p+i-1)=ch;       
  15.                 i++;
  16.                 j++;
  17.         }
  18.         else
  19.         {
  20.                 *(p+i-1)='\0';
  21.                 i++;
  22.                 j=1;
  23.                 if(*(p+i-2)!='\0')m++;
  24.         }
  25.         if(j>n) n=j;
  26. }
  27. char result[m][n];
  28. result[0][0]=a[0];
  29. printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
  30. printf("现在依次打印每个单词:\n");
  31. for(i=0;i<m;i++)
  32. {
  33.         printf("%s\n",result[i]);
  34. }
  35. return 0;
  36. }
复制代码


运行结果如下:
提问.jpg
输出的数组数值正确,说明存储没有问题。但是不能正确输出。求教原因。
最佳答案
2022-10-3 16:52:55
  1. result[0][0]=a[0];
  2. printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
复制代码

只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-2 22:57:30 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-2 23:22 编辑

        最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看。
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         char ch , a[2048]                                                     ;
  5.         int c , d , e , i , j , k , n                                         ;
  6.         printf("请输入一个英文句子:")                                        ;
  7.         for(c = d = e = n = 0 ; (ch = getchar()) != '\n' ;) {
  8.                 if(ch == ' ') {
  9.                         if(c) {
  10.                                 a[n ++] = ch                                  ;
  11.                                 if(c > e) e = c                               ;
  12.                                 c = 0                                         ;
  13.                                 d ++                                          ;
  14.                         }
  15.                 } else {
  16.                         a[n ++] = ch                                          ;
  17.                         c ++                                                  ;
  18.                 }
  19.         }
  20.         if(c) {
  21.                 if(c > e) e = c                                               ;
  22.                 d ++                                                          ;
  23.         }
  24.         char result[d][e + 1]                                                 ;
  25.         for(i = j = k = 0 ; k < n ; k ++) {
  26.                 if(a[k] != ' ') {
  27.                         result[i][j ++] = a[k]                                ;
  28.                 } else {
  29.                         if(j) {
  30.                                 result[i][j] = '\0'                           ;
  31.                                 j = 0                                         ;
  32.                                 i ++                                          ;
  33.                         }
  34.                 }
  35.         }
  36.         if(j) result[i][j] = '\0'                                             ;
  37.         printf("分割结果已存放到result[%d][%d]的二维数组中...\n" , d , e + 1) ;
  38.         printf("现在依次打印每个单词:\n")                                    ;
  39.         for(i = 0 ; i < d ; i ++) printf("%s\n" , result[i])                  ;
  40. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入一个英文句子:I love FishC.com!
  4. 分割结果已存放到result[3][11]的二维数组中...
  5. 现在依次打印每个单词:
  6. I
  7. love
  8. FishC.com!

  9. D:\[00.Exerciese.2022]\C>x
  10. 请输入一个英文句子:123 aBc    Test   FishC
  11. 分割结果已存放到result[4][6]的二维数组中...
  12. 现在依次打印每个单词:
  13. 123
  14. aBc
  15. Test
  16. FishC

  17. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-3 10:21:15 | 显示全部楼层
本帖最后由 顶级太阳 于 2022-10-3 10:22 编辑
jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看 ...


好奇怪,这次m怎么不变了?问题在哪里,看不明白。请教。
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a[2048]={0};                         //初步定义一维数组,用于存储输入。
  5. char *p=a;
  6. char ch;
  7. int m=1,n=1;                               //定义半固定变量,用于后面定义二维数组
  8. int i=1,j=1;                                  //定义各种循环用变量,随用随变

  9. printf("请输入一个英文句子:");
  10. while((ch=getchar())!='\n')          //讲屏幕输入存入内存
  11. {
  12.         if(ch!=32)
  13.         {
  14.                 *(p+i-1)=ch; //存入内容
  15.                 i++;             //移动指针用
  16.                 j++;             //计算单词长度
  17.         }
  18.         else
  19.         {
  20.                 *(p+i-1)='\0';  //将空格改为单词的结束符
  21.                 i++;             //指针后移
  22.                 j=1;             //重置单词长度
  23.                 if(*(p+i-2)!='\0')m++;  //计算单词数量,且用于后面二维数组行数定义
  24.         }
  25.         if(j>n) n=j;                  //计算最长单词长度,且用于后面二维数组列数定义
  26. }
  27. char result[m][n];
  28. result[0][0]=a[0];                          //为符合题目,同时将句子分割为单词
  29. printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
  30. printf("现在依次打印每个单词:\n");
  31. for(i=0;i<m;i++)                          //格式输出
  32. {
  33.         printf("%s\n",result[i]);
  34. }
  35. return 0;
  36. }
复制代码



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

使用道具 举报

发表于 2022-10-3 11:19:44 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-3 16:11 编辑
顶级太阳 发表于 2022-10-3 10:21
好奇怪,这次m怎么不变了?问题在哪里,看不明白。请教。

  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         char a[2048]={0}                                                           ;
  5.         char * p                                                                   ;
  6.         char ch                                                                    ;
  7.         int m=1,n=1                                                                ;
  8.         int i=1,j=1                                                                ;
  9.         printf("请输入一个英文句子:")                                             ;
  10.         for(p = a , j = m = n = 0 ; (ch = getchar()) != '\n' ;) {
  11.                 if(ch != 32) {
  12.                         * p ++ = ch                                                ;
  13.                         * p = '\0'                                                 ;
  14.                         if(! j) m ++                                               ;
  15.                         j ++                                                       ;
  16.                         if(j > n) n = j                                            ;
  17.                 } else {
  18.                         if(j) {
  19.                                 j = 0                                              ;
  20.                                 p ++                                               ;
  21.                         }
  22.                 }
  23.         }
  24.         char result[m][n + 1] , * q                                                ;
  25.         for(p = a , i = 0 ; i < m ; i ++) for(q = result[i] ; (* q ++ = * p ++) ;) ;
  26.         printf("分割结果已存放到result[%d][%d]的二维数组中...\n" , m , n + 1)      ;
  27.         printf("现在依次打印每个单词:\n")                                         ;
  28.         for(i = 0 ; i < m ; i ++) printf("%s\n" , result[i])                       ;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 11:32:57 From FishC Mobile | 显示全部楼层
(你只能 #include <stdio.h>)
回去了,就试试这个要求下,看能不能做到:
0分割字符串。

用户输入一个英文句子,你的程序将这个字符串按空格进行分割,返回由单词组成的二维数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 11:35:15 From FishC Mobile | 显示全部楼层
意思是不是把英语句子
I love, fish c. //16个char
缩成了这样
Ilovefishc. //12个char
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-3 13:17:21 | 显示全部楼层
howzyao 发表于 2022-10-3 11:35
意思是不是把英语句子
I love, fish c. //16个char
缩成了这样

不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是要提取每个单词,但是小甲鱼的例子里是这样的:
输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
那么我就理解为每两个空格之间作为一个需要提取的单体。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 13:38:12 | 显示全部楼层
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int i=0,j=0,max=0,p=0,s1,s2;
  5.     char a[1024];
  6.     printf("请输入一个英文句子:");
  7.     for (char ch=getchar();ch!='\n';ch=getchar())
  8.     {
  9.         a[p++] = ch;
  10.         if (ch!=' ') i++;
  11.         else
  12.         {
  13.             j++;
  14.             if (max < i) max = i;
  15.             i=0;
  16.         }
  17.     }
  18.     a[p++] = '\0';
  19.     if (max < i) max = i;
  20.     char result[j+1][max+1];
  21.     s1=j+1;
  22.     s2=max+1;
  23.     for (p=0,i=0,j=0;a[p]!='\0';p++)
  24.     {
  25.         if (a[p]!=' ') result[j][i++] = a[p];
  26.         else
  27.         {
  28.             result[j][i++] = '\0';
  29.             i=0;
  30.             j++;
  31.         }
  32.     }
  33.     printf("分割结果已存放到result[%d][%d]的二维数组中...\n",s1,s2);
  34.     printf("现在依次打印每个单词:\n");
  35.     for (i=0;i<s1;i++) printf("%s\n",result[i]);
  36.     return 0;
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 15:26:54 | 显示全部楼层

  1. #include <stdio.h>

  2. using namespace std;

  3. class chars
  4. {
  5.     int len;
  6.     char *p;
  7. public:
  8.     chars();
  9.    ~chars();
  10.     chars(char*,int l);

  11.    void disp();
  12.    void disp_detail();

  13.    char choice(int);
  14. };



  15. int main()
  16. {
  17.     char input[]= ";lkjasfdlsj sdf";

  18.     chars a(input,sizeof(input));
  19.     a.disp();
  20.     a.disp_detail();
  21.     printf( "%c",a.choice(15) );

  22.     return 0;
  23. }
  24. chars:: chars():len(0),p(0)
  25. {
  26.     ;
  27. }

  28. chars:: ~chars()
  29. {
  30.     delete [] p;
  31. }

  32. chars:: chars(char*a,int b):len(b)
  33. {
  34.     p=new char [b];
  35.     for(int i=0;i<len;i++)
  36.     {
  37.         p[i]=a[i];
  38.     }
  39.     p[len]='\n';
  40. }

  41. void chars :: disp()
  42. {
  43.     printf("%s\n",p);
  44. }

  45. void chars:: disp_detail()
  46. {
  47.     printf("存储字符串的首地址: %p\n",p);
  48.     printf("存储的字符串:       %s\n",p);
  49.     printf("存储字符串的长度:   %d\n",len-1);
  50. }

  51. char chars::choice(int I)
  52. {
  53.     if(I<len && I>-1 && I!=0)
  54.         return p[I-1];
  55.     else
  56.         return p[0];
  57. }
复制代码


sshot-1.png

看看,达标了没有.还入得了你的法眼不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 15:30:31 | 显示全部楼层
输入句子:I love FishC.com!
那么结果应该是分出来 I 算一个,love算一个,FishC.com!算一个。
看了,这还不容易,基于了类,就一切很容易,让本师付来小改一下.
稍后发图,并附上改动的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-3 16:52:55 | 显示全部楼层    本楼为最佳答案   
  1. result[0][0]=a[0];
  2. printf("分割结果已存放到result[%d][%d]的二维数组中...\n",m,n);
复制代码

只给result赋值了第一个元素,根本就没有做分割,这怎么能有结果呢
结果在字符串a里,不在result里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:06:04 | 显示全部楼层
顶级太阳 发表于 2022-10-3 13:17
不是这个意思,是从一个英文句子里提取出每两个空格之间的字符,并存储到一个二维数组里。本来题目给的是 ...
  1. #include <stdio.h>

  2. using namespace std;

  3. int main()
  4. {
  5.     char a[]= "U12a 34b, 56c";
  6.     int  b=0;
  7.     char *c = new char [ sizeof(a)];
  8.     char *d = new char [ sizeof(a)];

  9.     for(int i=0;i<sizeof(a);i++)
  10.     {
  11.         if(a[i]==32)
  12.         {
  13.             c[i]='0';
  14.             d[i]=a[i];
  15.         }
  16.         else
  17.         {
  18.             c[i]=a[i];
  19.             d[i]='0';
  20.         }
  21.         b++;
  22.     }
  23.     c[ sizeof(a)]='\n';
  24.     d[ sizeof(a)]='\n';

  25.     printf("共有%d个字符:\n",b);
  26.     printf("c == %s\n",c);
  27.     printf("d == %s",d);  // d尾部自带'\n'

  28.     int *sum = new int [ b ];

  29.     for(int i=0;i<b;i++)
  30.     {
  31.         if(d[i]=='0')
  32.             sum[i]=1;
  33.         else
  34.             sum[i]=0;
  35.     }

  36.     printf("sum  ");

  37.     for(int i=0;i<b;i++)
  38.     printf("%d",sum[i]);

  39.     //找到空格数,和各段字符数时,就可以创建char a[x][y] 了;
  40.     // ==0 && ==1 时,一定是字符 y列就可以读入字符;
  41.     // ==0 && ==32时,一定是空格,是空格,x行,就可以换行了;

  42.     delete [] c,d,sum;

  43.     return 0;
  44. }
复制代码


这回行吗.能不能做到题目要求?
sshot-2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:10:14 | 显示全部楼层
howzyao 发表于 2022-10-4 00:06
这回行吗.能不能做到题目要求?

要求用C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:12:55 | 显示全部楼层
jackz007 发表于 2022-10-2 22:57
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048] 试试看 ...
最要命的问题是,用来储存所有字符串的一维数组的容量为 char a[2],把它改为 char a[2048]


这么改的话,会不会太长了?他说要最小内存.看看我想的最土的办法,还有没有能更加改进简化的思路.谢谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:16:48 | 显示全部楼层

上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 00:33:05 | 显示全部楼层
howzyao 发表于 2022-10-4 00:16
上面的,已改写了,没有用class,应当是纯C吧?
合乎要求吗?也是学系统的补反码的思路启发.

要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 22:37:30 | 显示全部楼层
人造人 发表于 2022-10-4 00:33
要求用C语言 的意思可以理解成是 要求用C语言的编译器编译代码
要求用C语言的编译器


我用的是GUN GCC Compiler
这个算吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 22:55:48 | 显示全部楼层
howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?



请告诉我,我哪里做错了


  1. $ ls
  2. main.c
  3. $ cat main.c
  4. #include <stdio.h>

  5. using namespace std;

  6. int main()
  7. {
  8.     char a[]= "U12a 34b, 56c";
  9.     int  b=0;
  10.     char *c = new char [ sizeof(a)];
  11.     char *d = new char [ sizeof(a)];

  12.     for(int i=0;i<sizeof(a);i++)
  13.     {
  14.         if(a[i]==32)
  15.         {
  16.             c[i]='0';
  17.             d[i]=a[i];
  18.         }
  19.         else
  20.         {
  21.             c[i]=a[i];
  22.             d[i]='0';
  23.         }
  24.         b++;
  25.     }
  26.     c[ sizeof(a)]='\n';
  27.     d[ sizeof(a)]='\n';

  28.     printf("共有%d个字符:\n",b);
  29.     printf("c == %s\n",c);
  30.     printf("d == %s",d);  // d尾部自带'\n'

  31.     int *sum = new int [ b ];

  32.     for(int i=0;i<b;i++)
  33.     {
  34.         if(d[i]=='0')
  35.             sum[i]=1;
  36.         else
  37.             sum[i]=0;
  38.     }

  39.     printf("sum  ");

  40.     for(int i=0;i<b;i++)
  41.     printf("%d",sum[i]);

  42.     //找到空格数,和各段字符数时,就可以创建char a[x][y] 了;
  43.     // ==0 && ==1 时,一定是字符 y列就可以读入字符;
  44.     // ==0 && ==32时,一定是空格,是空格,x行,就可以换行了;

  45.     delete [] c,d,sum;

  46.     return 0;
  47. }
  48. $ gcc --version
  49. gcc (GCC) 12.2.0
  50. Copyright (C) 2022 Free Software Foundation, Inc.
  51. This is free software; see the source for copying conditions.  There is NO
  52. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  53. $ gcc -g -Wall -o main main.c
  54. main.c:3:1: error: unknown type name ‘using’
  55.     3 | using namespace std;
  56.       | ^~~~~
  57. main.c:3:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘std’
  58.     3 | using namespace std;
  59.       |                 ^~~
  60. main.c: In function ‘main’:
  61. main.c:9:15: error: ‘new’ undeclared (first use in this function)
  62.     9 |     char *c = new char [ sizeof(a)];
  63.       |               ^~~
  64. main.c:9:15: note: each undeclared identifier is reported only once for each function it appears in
  65. main.c:9:19: error: expected ‘,’ or ‘;’ before ‘char’
  66.     9 |     char *c = new char [ sizeof(a)];
  67.       |                   ^~~~
  68. main.c:10:19: error: expected ‘,’ or ‘;’ before ‘char’
  69.    10 |     char *d = new char [ sizeof(a)];
  70.       |                   ^~~~
  71. main.c:33:20: error: expected ‘,’ or ‘;’ before ‘int’
  72.    33 |     int *sum = new int [ b ];
  73.       |                    ^~~
  74. main.c:52:5: error: ‘delete’ undeclared (first use in this function)
  75.    52 |     delete [] c,d,sum;
  76.       |     ^~~~~~
  77. main.c:52:13: error: expected expression before ‘]’ token
  78.    52 |     delete [] c,d,sum;
  79.       |             ^
  80. $ ls
  81. main.c
  82. $
复制代码



你能分清C语言和C++吗?

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

使用道具 举报

发表于 2022-10-4 22:57:40 | 显示全部楼层
howzyao 发表于 2022-10-4 22:37
我用的是GUN GCC Compiler
这个算吗?

另外,GUN 是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 23:02:48 | 显示全部楼层
人造人 发表于 2022-10-4 22:55
请告诉我,我哪里做错了
你能分清C语言和C++吗?


谢谢,确实不能.


前面为什么要加上这:

$ ls
main.c
$ cat main.c

后面的使用关键字,空间,也是超出C的范围 了吗?
还有 new
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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