鱼C论坛

 找回密码
 立即注册
查看: 4040|回复: 17

求指点,将输入的数字存放在数组中并打印出来

[复制链接]
发表于 2016-8-13 15:16:41 | 显示全部楼层 |阅读模式

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

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

x
如题,我写了个短程序来试验这个功能,但是运行结果并非我想象的那样
代码如下
#include<stdio.h>

void main()

{
        char num[100]={0} ;        /将字符存放到这些数组内        
        char ch[100]= {0} ;                //此处是暂时存放字符,用来赋值给num
        int  k ,  i=0 , j=0 ;                 //将ch数组中的值赋值给num数组所必须的变量
        printf("Please input a sentence :");
        while  ( ( ch[j]=getchar() )  >= '0'  &&  ( ch[j]=getchar() )  <= '9')                        //执行循环的条件
        {
                num[i++]=ch[j++];
        }
        j=0;                        //由于上一条语句改变了j的值,利用这一条语句给j重新赋值
        printf("存放在num数组内的字符是:");
        for(k=0;k<=i;k++)
        {
                printf(" %c  ",ch[j++]);
        }
        
}


运行之后的结果十分奇怪,只能打印第2,4,6。。。个数(即第偶数位个数),希望能有人给我指点一下,我单步调试后也发现程序进行第一个赋值的时候是直接从第二个开始的,例如我输入123,它只能打印2.
如果里面的条件改为while(  ( ch[j]=getchar() )!='\n')的话,程序是可以正常运行的,因为我是自己想出这种算法,想用这种算法来套用这里让我完成另一个程序

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

使用道具 举报

发表于 2016-8-13 16:38:04 | 显示全部楼层
问题出在第10行
#include<stdio.h>
void main()
{
                char num[100]={'\0'};               
        char ch[100]={'\0'};   
                char c;                               
        int i,j;
                i=j=0;
        printf("Please input a sentence :");
        while ((c=getchar())>='0'&&c<='9')                       
        {
                num[i++]=ch[j++]=c;
        }                     
                ch[j]='\0';
        printf("存放在num数组内的字符是:");
        printf(" %s",ch);
                printf("\n");   
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-8-13 17:17:26 | 显示全部楼层
lelen99 发表于 2016-8-13 16:38
问题出在第10行
#include
void main()

这样啊,能不能和我解释一下为什么呀。
虽然刚开始使用这个条件的时候,我有些担心使用两个这个会不会出现需要输入两次。
这样改是不是因为先进行输入,然后就可以直接使用C这个值来进行判断
那如果我想继续使用这个值,就是拿来给下一个循环进行判断,是否还是继续引用c。

其实呢这只是我要解决的问题的一部分,完整的问题是计算所有输入符中的数字数量,空白符和其他所有字符的数量,如果我想实现这一目标是否需要进行循环的嵌套,还是说直接添加循环。
还有一个问题就是,数组的初始化不能用0吗?
最后一点我觉得好厉害,我完全没想到用字符串的格式来打印数组,果然程序还是打得太少了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-13 20:41:49 | 显示全部楼层
#include<stdio.h>
void main(){
        char c;
        int digit,space,other,sign;
        digit=space=other=sign=0;
        printf("请输入一行字符(以回车结束输入):\n");
        while((c=getchar())!='\n'){
                if(c>='0' && c<='9' && sign==0){
                        digit++;
                        sign=1;
                }
                else if(c==' '){
                        space++;
                        sign=0;
                }
                else if( c<'0' || c>'9'){
                        other++;
                        sign=0;
                }
        }
        printf("字符统计如下:\ndigit=%d\nspce=%d\nother=%d\n",digit,space,other);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-8-13 23:25:17 | 显示全部楼层
lelen99 发表于 2016-8-13 20:41
#include
void main(){
        char c;

谢谢你这么费心思的帮我解答问题,等我升级了就加你好友,你给的代码我会好好研究的,还有就是打代码可以选择上面这个<>符号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-13 23:50:32 | 显示全部楼层
你在判断的时候读取了两次
while 里面getchar 了两次,第二次覆盖了第一次,所以只有偶数个进去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-14 00:56:22 | 显示全部楼层
Krant5 发表于 2016-8-13 23:50
你在判断的时候读取了两次
while 里面getchar 了两次,第二次覆盖了第一次,所以只有偶数个进去了

哦哦,明白了,谢谢你了呀。
我会努力学习的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-14 07:53:48 | 显示全部楼层
getchar 由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.(百度而来)
根据这个函数德行来看,你要把判断语句再改一下。
如果你输入123ASD123那么它只会输出123,并且ASD123会在缓存区中保留,函数在调用getchar是直接从缓存中调取,容易发生错误
如果想要输出123123那么就要清除缓存,一旦清除缓存会将整个数据流清除,后面的数就消失了。
我是小白只提供问题,还没想到解决办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-14 07:54:34 | 显示全部楼层
getchar 由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.(百度而来)
根据这个函数德行来看,你要把判断语句再改一下。
如果你输入123ASD123那么它只会输出123,并且ASD123会在缓存区中保留,函数在调用getchar是直接从缓存中调取,容易发生错误
如果想要输出123123那么就要清除缓存,一旦清除缓存会将整个数据流清除,后面的数就消失了。
我是小白只提供问题,还没想到解决办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-14 07:57:57 | 显示全部楼层
见谅我这里网络有问题
发不出去,我就多按了几下就成这样了
表示烂电脑想砸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-14 09:11:18 | 显示全部楼层
再加个数组
while(getchar()!=“\n”)
{       if   判断是否在0到9之间循环输出
         else 不在就把它放进没用的数组中
}
这样应该可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-8-14 19:08:26 | 显示全部楼层
qwe1231069 发表于 2016-8-14 07:57
见谅我这里网络有问题
发不出去,我就多按了几下就成这样了
表示烂电脑想砸

没事,可以理解,我就觉得鱼C的论坛有点不好就是不能删帖,让我感觉有些不方便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-14 19:10:11 | 显示全部楼层
qwe1231069 发表于 2016-8-14 07:54
getchar 由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值.当程序调用getchar时.程 ...

谢谢你的见解,我会好好分析的,到时候再和你讨论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-14 23:43:15 | 显示全部楼层
lelen99 发表于 2016-8-13 20:41
#include
void main(){
        char c;

你好大神,你的这个程序我运行了一下,发现有个小问题,为什么你要添加sign这一个变量呢?
尤其是添加在第一个判断条件之后,导致最后打印出来的数字只有一个,可否告诉我你这个变量的用意,我们一起讨论讨论。
我个人觉得这个sign这个变量没什么作用啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 00:13:19 | 显示全部楼层
lelen99 发表于 2016-8-13 20:41
#include
void main(){
        char c;

我自己通过结合你给我的两个函数,做出了修改并完成了问题
但我又有另一个问题想提出来
        while((c=getchar())!='\n')
        {
                if( c>='0'  &&  c<='9' )
                {
                        digit++;
                        num[i++]=c;
                }

为什么我将if换成while,程序就会不进行运算呢?我先去调试一下,看看想出来的答案和你的一不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 00:16:06 | 显示全部楼层
lelen99 发表于 2016-8-13 20:41
#include
void main(){
        char c;

我明白了,如果使用while的话,我没有跳出的条件,所以会进入死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 07:30:36 | 显示全部楼层
轮回的夏 发表于 2016-8-14 23:43
你好大神,你的这个程序我运行了一下,发现有个小问题,为什么你要添加sign这一个变量呢?
尤其是添加在 ...

例如输入:12 32 a3
digit=3;     space=2;      other=1;
1232算一个数字,sign变量的作用就是把连续数字看做一个数字。
不需要的话去掉就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-8-15 15:40:25 | 显示全部楼层
lelen99 发表于 2016-8-15 07:30
例如输入:12 32 a3
digit=3;     space=2;      other=1;
12和32算一个数字,sign变量的作用就是把连 ...

好的,我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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