顶级太阳 发表于 2022-10-6 10:50:02

s1e26 为什么屏幕录入结果不能正确存入数组了?

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

int main()
{
        char a;
        char ch;
        int m=1,n=0;
        int i=0,j=1,k,p;

        printf("请输入一个英文句子:");
        while((ch=getchar()!='\n'))
        {
                if(ch!=' ')
                {
                        a=ch;//将屏幕录入的字符存入数组,现在问题就卡在了这里,
                        i++;       //移动数组位置
                        j++;   //计算单词长度
                }
                else
                {
                        a='\0';//将空格更换为结束符存储
                        i++;
                        j=1;   //新一个单词计数
                        m++;   //新一个单词开始位置
                }
                if(j>n)n=j;
        }
        char result;   //定义题目要求的可变数组
for(i=0;i<20;i++)printf("a[%d]=%c\n",i,a);   //临时检查录入结果,运行时发现数组里并没有内容
/*
//将存入值转存到题目要求的数组
        i=0;
        for(k=0;k<m;k++)
        {
                for(p=0;p<n;p++)
                {
                        result=a;
                        i++;
                        if(result='\0')break;
                }

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


运行结果

临时号 发表于 2022-10-6 10:55:17

看我注释
#include<stdio.h>

int main()
{
      char a;
      char ch;
      int m=1,n=0;
      int i=0,j=1,k,p;

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

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

jackz007 发表于 2022-10-6 11:04:50

本帖最后由 jackz007 于 2022-10-6 11:58 编辑

      第11行应该是:
      while((ch=getchar())!='\n')
      这是我写的代码版本,谨供楼主参考
#include<stdio.h>

int main()
{
      char ch , a                                                      ;
      int i , j , k , m, n                                                   ;

      printf("请输入一个英文句子:")                                           ;
      for(i = m = 0 , j = n = 1 ; (ch = getchar()) != '\n' ;) {
                if(ch != ' ') {
                        if(j == 1) m ++                                          ;
                        a = ch                                             ;
                        a = '\0'                                              ;
                        j ++                                                   ;
                        if(j > n) n = j                                          ;
                } else {
                        if(j > 1) {                                                // 只有字符串之间的单个空格有效
                              j = 1                                          ;
                              i ++                                             ; // 保护上个字符串末尾的 '\0'
                        }
                }
      }
      char result                                                      ;
      for(i = k = 0 ; i < m ; i ++) for(j = 0 ; (result = a) ;) ; // 这里绝不可以只是简单地按照每个字符串 n 个字符进行分割和复制
      printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n" , m , n) ;
      printf("现在依次打印每个单词:\n")                                       ;
      for(k = 0 ; k < m ; k ++) printf("%s\n" , result)                     ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
请输入一个英文句子:         I         am          a         disco      danncer!
分割结果已存放到result的二维数组中。。。。。
现在依次打印每个单词:
I
am
a
disco
danncer!

D:\\C>

顶级太阳 发表于 2022-10-6 11:53:27

jackz007 发表于 2022-10-6 11:04
第11行应该是:

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


谢谢。这脑袋是木头疙瘩的。

jhq999 发表于 2022-10-6 12:05:58

#include<stdio.h>

int main()
{
    char s={0},*s1=s;
    int rt=scanf("%s",s);
    int i=0;
    while(getwchar()!='\n')
    {
      while(s);
      rt=scanf("%s",s+i);
    }
    rt=printf("%s\n",s1);
    s1+=rt;
    while(rt>1)
    {
      rt=printf("%s\n",s1);
      s1+=rt;
    }
    return 0;
}

jackz007 发表于 2022-10-6 12:15:40

jhq999 发表于 2022-10-6 12:05


      题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。

jhq999 发表于 2022-10-6 12:46:32

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

没看到{:5_94:}{:5_104:}

顶级太阳 发表于 2022-10-6 16:08:35

jackz007 发表于 2022-10-6 11:04
第11行应该是:

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


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

jackz007 发表于 2022-10-6 16:45:31

本帖最后由 jackz007 于 2022-10-6 17:00 编辑

          先传递字符,再 j ++、k ++ ,然后,才判断刚才传递的字符是不是 '\0',如果是,那就结束。所以,这条语句会把整个单词连同末尾的 '\0' 一起传递完了才会终止循环。

顶级太阳 发表于 2022-10-6 17:54:59

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

首先,谢谢回复。
其次,我还是没有明白。for循环的第二条件是,当这一个条件为0,或者说判断结果错误的时候,结束循环。那么在你的代码里,想数组result赋值了数组a的值,为什么会被判断为0呢?

jackz007 发表于 2022-10-6 18:01:41

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

         被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字符的 ASCII 编码非 0 值时,循环得以正常继续,否则,就会立即结束。

顶级太阳 发表于 2022-10-6 18:45:54

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

学习了,谢谢。

顶级太阳 发表于 2022-10-6 18:47:02

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

学习了,谢谢
页: [1]
查看完整版本: s1e26 为什么屏幕录入结果不能正确存入数组了?