鱼C论坛

 找回密码
 立即注册
查看: 2793|回复: 12

[已解决]s1e26 为什么屏幕录入结果不能正确存入数组了?

[复制链接]
发表于 2022-10-6 10:50:02 | 显示全部楼层 |阅读模式

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

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

x
遇到一个很弱智的问题,应该是很久以前就学过的。可是现在找不到原因了,求助。
题目要求屏幕录入一个英文句子,将句子拆分成一个个单独的单词。第一步存入数组,一开始还可以存入,可是代码改来改去,现在不能存入了,求助什么原因?感觉应该是某一个很简单的点,但是就是找不到呀。
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         char a[1024];
  5.         char ch;
  6.         int m=1,n=0;
  7.         int i=0,j=1,k,p;

  8.         printf("请输入一个英文句子:");
  9.         while((ch=getchar()!='\n'))
  10.         {
  11.                 if(ch!=' ')
  12.                 {
  13.                         a[i]=ch;  //将屏幕录入的字符存入数组,现在问题就卡在了这里,
  14.                         i++;         //移动数组位置
  15.                         j++;     //计算单词长度
  16.                 }
  17.                 else
  18.                 {
  19.                         a[i]='\0';//将空格更换为结束符存储
  20.                         i++;
  21.                         j=1;     //新一个单词计数
  22.                         m++;     //新一个单词开始位置
  23.                 }
  24.                 if(j>n)n=j;
  25.         }
  26.         char result[m][n];   //定义题目要求的可变数组
  27. for(i=0;i<20;i++)printf("a[%d]=%c\n",i,a[i]);   //临时检查录入结果,运行时发现数组里并没有内容
  28. /*
  29. //将存入值转存到题目要求的数组
  30.         i=0;
  31.         for(k=0;k<m;k++)
  32.         {
  33.                 for(p=0;p<n;p++)
  34.                 {
  35.                         result[k][p]=a[i];
  36.                         i++;
  37.                         if(result[k][p]='\0')break;
  38.                 }

  39.         }
  40.         printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n",m,n);
  41. //结果数组格式输出
  42.         printf("现在依次打印每个单词:\n");
  43.         for(k=0;k<m;k++)printf("%s",result[k]);
  44. */
  45. return 0;
  46. }
复制代码


运行结果
提问.jpg
最佳答案
2022-10-6 11:04:50
本帖最后由 jackz007 于 2022-10-6 11:58 编辑

        第11行应该是:
  1.         while((ch=getchar())!='\n')
复制代码

        这是我写的代码版本,谨供楼主参考
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         char ch , a[1024]                                                        ;
  5.         int i , j , k , m  , n                                                   ;

  6.         printf("请输入一个英文句子:")                                           ;
  7.         for(i = m = 0 , j = n = 1 ; (ch = getchar()) != '\n' ;) {
  8.                 if(ch != ' ') {
  9.                         if(j == 1) m ++                                          ;
  10.                         a[i ++] = ch                                             ;
  11.                         a[i] = '\0'                                              ;
  12.                         j ++                                                     ;
  13.                         if(j > n) n = j                                          ;
  14.                 } else {
  15.                         if(j > 1) {                                                // 只有字符串之间的单个空格有效  
  16.                                 j = 1                                            ;
  17.                                 i ++                                             ; // 保护上个字符串末尾的 '\0'
  18.                         }
  19.                 }
  20.         }
  21.         char result[m][n]                                                        ;
  22.         for(i = k = 0 ; i < m ; i ++) for(j = 0 ; (result[i][j ++] = a[k ++]) ;) ; // 这里绝不可以只是简单地按照每个字符串 n 个字符进行分割和复制
  23.         printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n" , m , n) ;
  24.         printf("现在依次打印每个单词:\n")                                       ;
  25.         for(k = 0 ; k < m ; k ++) printf("%s\n" , result[k])                     ;
  26. }
复制代码

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

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

  11. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-6 10:55:17 | 显示全部楼层
看我注释
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         char a[1024];
  5.         char ch;
  6.         int m=1,n=0;
  7.         int i=0,j=1,k,p;

  8.         printf("请输入一个英文句子:");
  9.         while((ch=getchar())!='\n')  // 老问题了,我记得你之前也问过,长点记性吧
  10.         {
  11.                 if(ch!=' ')
  12.                 {
  13.                         a[i]=ch;  //将屏幕录入的字符存入数组,现在问题就卡在了这里,
  14.                         i++;         //移动数组位置
  15.                         j++;     //计算单词长度
  16.                 }
  17.                 else
  18.                 {
  19.                         a[i]='\0';//将空格更换为结束符存储
  20.                         i++;
  21.                         j=1;     //新一个单词计数
  22.                         m++;     //新一个单词开始位置
  23.                 }
  24.                 if(j>n)n=j;
  25.         }
  26.         char result[m][n];   //定义题目要求的可变数组
  27. for(i=0;i<20;i++)printf("a[%d]=%c\n",i,a[i]);   //临时检查录入结果,运行时发现数组里并没有内容
  28. /*
  29. //将存入值转存到题目要求的数组
  30.         i=0;
  31.         for(k=0;k<m;k++)
  32.         {
  33.                 for(p=0;p<n;p++)
  34.                 {
  35.                         result[k][p]=a[i];
  36.                         i++;
  37.                         if(result[k][p]='\0')break;
  38.                 }

  39.         }
  40.         printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n",m,n);
  41. //结果数组格式输出
  42.         printf("现在依次打印每个单词:\n");
  43.         for(k=0;k<m;k++)printf("%s",result[k]);
  44. */
  45. return 0;
  46. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 11:04:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-6 11:58 编辑

        第11行应该是:
  1.         while((ch=getchar())!='\n')
复制代码

        这是我写的代码版本,谨供楼主参考
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         char ch , a[1024]                                                        ;
  5.         int i , j , k , m  , n                                                   ;

  6.         printf("请输入一个英文句子:")                                           ;
  7.         for(i = m = 0 , j = n = 1 ; (ch = getchar()) != '\n' ;) {
  8.                 if(ch != ' ') {
  9.                         if(j == 1) m ++                                          ;
  10.                         a[i ++] = ch                                             ;
  11.                         a[i] = '\0'                                              ;
  12.                         j ++                                                     ;
  13.                         if(j > n) n = j                                          ;
  14.                 } else {
  15.                         if(j > 1) {                                                // 只有字符串之间的单个空格有效  
  16.                                 j = 1                                            ;
  17.                                 i ++                                             ; // 保护上个字符串末尾的 '\0'
  18.                         }
  19.                 }
  20.         }
  21.         char result[m][n]                                                        ;
  22.         for(i = k = 0 ; i < m ; i ++) for(j = 0 ; (result[i][j ++] = a[k ++]) ;) ; // 这里绝不可以只是简单地按照每个字符串 n 个字符进行分割和复制
  23.         printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n" , m , n) ;
  24.         printf("现在依次打印每个单词:\n")                                       ;
  25.         for(k = 0 ; k < m ; k ++) printf("%s\n" , result[k])                     ;
  26. }
复制代码

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

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

  11. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 11:53:27 | 显示全部楼层
jackz007 发表于 2022-10-6 11:04
第11行应该是:

        这是我写的代码版本,谨供楼主参考

谢谢。这脑袋是木头疙瘩的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 12:05:58 | 显示全部楼层
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     char s[1024]={0},*s1=s;
  5.     int rt=scanf("%s",s);
  6.     int i=0;
  7.     while(getwchar()!='\n')
  8.     {
  9.         while(s[i++]);
  10.         rt=scanf("%s",s+i);
  11.     }
  12.     rt=printf("%s\n",s1);
  13.     s1+=rt;
  14.     while(rt>1)
  15.     {
  16.         rt=printf("%s\n",s1);
  17.         s1+=rt;
  18.     }
  19.     return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 12:15:40 | 显示全部楼层

        题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 12:46:32 | 显示全部楼层
jackz007 发表于 2022-10-6 12:15
题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。

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

使用道具 举报

 楼主| 发表于 2022-10-6 16:08:35 | 显示全部楼层
jackz007 发表于 2022-10-6 11:04
第11行应该是:

        这是我写的代码版本,谨供楼主参考

谢谢jackz的讲解和代码。但是你的代码我看了一个下午了,只是看懂了前面存入采用的是和小甲鱼输出矩阵同一个方法,对结束符进行覆盖。
请问一下:你的代码第24行中,第二层循环for的第二个条件result[i][j++]=a[k++]是如何实现在遇到结束符时候判断为假的?这个语句应该是将数组a[k]的值赋给数组result[i][j],那么怎么会是由于a[k]=\0而被判断为假呢?不理解。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-6 16:45:31 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-6 17:00 编辑

          先传递字符,再 j ++、k ++ ,然后,才判断刚才传递的字符是不是 '\0',如果是,那就结束。所以,这条语句会把整个单词连同末尾的 '\0' 一起传递完了才会终止循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 17:54:59 | 显示全部楼层
jackz007 发表于 2022-10-6 16:45
先传递字符,再 j ++、k ++ ,然后,才判断刚才传递的字符是不是 '\0',如果是,那就结束。所以 ...

首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的时候,结束循环。那么在你的代码里,想数组result赋值了数组a的值,为什么会被判断为0呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-10-6 18:01:41 | 显示全部楼层
顶级太阳 发表于 2022-10-6 17:54
首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的 ...


         被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字符的 ASCII 编码非 0 值时,循环得以正常继续,否则,就会立即结束。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 18:45:54 | 显示全部楼层
顶级太阳 发表于 2022-10-6 17:54
首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的 ...

学习了,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-6 18:47:02 | 显示全部楼层
jackz007 发表于 2022-10-6 18:01
被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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