鱼C论坛

 找回密码
 立即注册
查看: 3637|回复: 9

鱼哥C教程45课的一个小问题!求助!

[复制链接]
发表于 2013-1-26 00:18:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 □为 于 2022-11-17 20:58 编辑

【写在前面】
你可以说我爱钻牛角尖!
没错,和你们说个小秘密喔,其实俺是性“牛”。
也可以说我没事找事!
没错,我整天就是闲的蛋疼,现在蛋揉的不疼了。菊花又痒痒了!
【正文开始】
哈哈,上面和大家开了些玩笑,还请大家别贱笑啊!好了废话不多说,问题开始!
在45课教程中,提到的是指向多维数组的指针变量里面那些不为人知的秘密,这道例程,哈哈,大家也别去找了,我还是直接贴出鱼哥老湿的源码
#include <stdio.h>void main ( )
{
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
int (*p)[4], i, j;

p = a;

printf("i = ");
scanf("%d", &i);
while( i > 2 || i < 0 )
{
printf("i = ");
scanf("%d", &i);
}
printf("j = ");
scanf("%d", &j);
while( j > 3 || i < 0 )
{
printf("j = ");
scanf("%d", &j);
}
printf("a[%d, %d] = %d\n", i, j, *(*(p+i)+j));
}


我想问的就是在代码中怎么修改才能避免在程序运行过程时当键盘输入非数字的字符而导致的陷入的屎循环呢?大家可能好不明白我说的啥,好吧,在来张图!
1.jpg
当输入q按回车或不是0-9数字时候会出现死循环!
如何能避免这种情况发生呢?
该怎么修改源码呢?
别来高深的啥函数什么的!!!
求一种简单易懂,能够让这个初中没毕业的小菜看懂就行!
在线坐等!

2012-01-26



小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-26 00:33:16 | 显示全部楼层
:'(肿么没人理俺呢???
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-26 02:10:04 | 显示全部楼层
你半夜三更发。。。没人很正常。。
指针数组还是指针数组。。。。没怎么用过,帮不了你了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-26 09:55:55 | 显示全部楼层
  1. #include <stdio.h>
  2. void Warn();
  3. void main ()
  4. {
  5.         int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
  6.         int (*p)[4], i, j;

  7.         p = a;

  8.         printf("i = ");
  9.         scanf("%d", &i);//这既然让你输入i , 为什么下面会有一个循环控制呢?就是因为如果你的i>2 , 或i<0时就是让你重新输入嘛,说明你前面输错啦
  10.         while( i > 2 || i < 0 )
  11.         {
  12.                 Warn();
  13.                 fflush(stdin);//刷新缓冲区
  14.                 printf("i = ");
  15.                 scanf("%d", &i);
  16.         }
  17.         printf("j = ");
  18.         scanf("%d", &j);
  19.         while( j > 3 || i < 0 )
  20.         {
  21.                 Warn();
  22.                 fflush(stdin);//同上
  23.                 printf("j = ");
  24.                 scanf("%d", &j);
  25.         }
  26.         printf("a[%d, %d] = %d\n", i, j, *(*(p+i)+j));
  27. }

  28. void Warn()
  29. {
  30.         printf("the num you input is illeagl ! , please input again! (the num must be 0<=num<=2)!!! \n");//在这提示下用户即可 ,OK
  31. }
复制代码
还有提醒下楼主, 现在是2013年1月26号哦, 不是2012 ^_^
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-26 22:37:55 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-26 22:39:19 | 显示全部楼层
空虚寂寞冻 发表于 2013-1-26 02:10
你半夜三更发。。。没人很正常。。
指针数组还是指针数组。。。。没怎么用过,帮不了你了

好吧,唉,,,,:(
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-26 22:45:12 | 显示全部楼层
:(/...........没人理…
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-27 09:28:21 | 显示全部楼层
□为 发表于 2013-1-26 22:37
感谢这位兄台的热心帮助…!
但是表示看不懂你定义的那个函数…
  1. #include <stdio.h>
  2. void main ()
  3. {
  4.         int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
  5.         int (*p)[4], i, j;

  6.         p = a;

  7.         printf("i = ");
  8.         scanf("%d", &i);//这既然让你输入i , 为什么下面会有一个循环控制呢?就是因为如果你的i>2 , 或i<0时就是让你重新输入嘛,说明你前面输错啦
  9.         while( i > 2 || i < 0 )
  10.         {
  11.                 printf("the num you input is illeagl ! , please input again! (the num must be 0<=num<=2)!!! \n");
  12.                 fflush(stdin);//刷新缓冲区
  13.                 printf("i = ");
  14.                 scanf("%d", &i);
  15.         }
  16.         printf("j = ");
  17.         scanf("%d", &j);
  18.         while( j > 3 || i < 0 )
  19.         {
  20.                 printf("the num you input is illeagl ! , please input again! (the num must be 0<=num<=2)!!! \n");
  21.                 fflush(stdin);//同上
  22.                 printf("j = ");
  23.                 scanf("%d", &j);
  24.         }
  25.         printf("a[%d, %d] = %d\n", i, j, *(*(p+i)+j));
  26. }
复制代码
其实我自定义的Warn()函数就是把上面添加的printf()语句封装了下么 , 那个fflush()函数是C语言里很有用的一个函数,兄台务必要好好查查哦
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-27 11:05:49 | 显示全部楼层
□为 发表于 2013-1-26 22:45
/...........没人理…

下断点自己看下吧。
当我们输入纯数字时
1.jpg
我所输入的数值1成功被存入

当我们输入非数字时
2.jpg
i始终为初始值:-858993460

答案应该是这样的:
scanf("%d", &i);
这语句已经指定了输入的数据必须是十进制数字

当我们输入字符时
scanf智能判断为非数字(它如果不判断的话应该会传入ASCII对应的值)
然后就传入失败了
然后就是让面的初始值-858993460
然后就一直符合你的判断要求一直打印
至于为什么判断循环中scanf没有反应
我的猜测是这样的scanf函数一般从输入流中提取出需要传入的
数据后,会自动将流中的数据提完后删掉
但是我们存入失败了
于是并没有把输入流的东西清掉
然后造成输入流有数据
就一直读取一直printf



为了验证猜想
于是我在循环中添加一句fflush(stdin)来清空输入流
然后进行测试是否循环中的scanf有反应了
测试成功 3.jpg







评分

参与人数 1鱼币 +5 收起 理由
□为 + 5 感谢这位兄弟!呵呵!明白怎么回事了!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-1-27 20:06:33 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-27 11:05
下断点自己看下吧。
当我们输入纯数字时

非常感谢!!!  看明白了!!嘿嘿!!!!    兄弟,你QQ多少 我可以加下你么! 希望能共同学习! 或者你加我也行,QQ:821024807:$
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-8 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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