鱼C论坛

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

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

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

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

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

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

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

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

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

运行结果
提问.jpg
最佳答案
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[1024]                                                        ;
        int i , j , k , m  , n                                                   ;

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

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

        }
        printf("分割结果已存放到result[%d][%d]的二维数组中。。。。。\n",m,n);
//结果数组格式输出
        printf("现在依次打印每个单词:\n");
        for(k=0;k<m;k++)printf("%s",result[k]);
*/
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1024]                                                        ;
        int i , j , k , m  , n                                                   ;

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

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

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

使用道具 举报

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

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

谢谢。这脑袋是木头疙瘩的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int main()
{
    char s[1024]={0},*s1=s;
    int rt=scanf("%s",s);
    int i=0;
    while(getwchar()!='\n')
    {
        while(s[i++]);
        rt=scanf("%s",s+i);
    }
    rt=printf("%s\n",s1);
    s1+=rt;
    while(rt>1)
    {
        rt=printf("%s\n",s1);
        s1+=rt;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        题目要求用尽可能小的动态二维数组保存切分好的单词并进行显示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没看到
想知道小甲鱼最近在做啥?请访问 -> 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而被判断为假呢?不理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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


         被复制字符的 ASCII 码数值就是整个表达式的值,也是维持循环所依据的逻辑条件,当被复制的字符的 ASCII 编码非 0 值时,循环得以正常继续,否则,就会立即结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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