当scanf输入数据错误的时候,到底发生了什么?

buyiwangzi 2009-03-21 11:51:11
代码先贴上来:
1 #include<stdio.h>
2 main(){
3 int array[10];
4 int temp;
5 int i,j;
6 printf("input ten numbers(between -32768 and +32767):\n");
7 for(i=0;i<10;i++){
8 scanf("%d",&temp);
9 if(temp<-32768 || temp>32767){
10 i--;
11 printf("number must between -32768 and +32767\ntry again:\n");
12 continue;
13 }else{
14 array[i]=temp;
15 }
16 }
17 printf("your numbers:\n");
18 for(j=0;j<10;j++){
19 printf(" %d ",array[j]);
20 }
21
22 printf("\ngod bye\n");
23 }

开发环境:redhatlinux9.0,编译工具是gcc
正常通过运行;
测试数据第一种情况:
input ten numbers(between -32768 and +32767):
123 322 32 121 2
32
34
4
2 4
your numbers:
123 322 32 121 2 32 34 4 2 4
god bye
测试数据第二种情况:
input ten numbers(between -32768 and +32767):
12 344 43 e
your numbers:
12 344 43 43 43 43 43 43 43 43
god bye
测试第三组数据:
input ten numbers(between -32768 and +32767):
g
进入死循环

大家帮我看看错误在哪里啊.
当使用scanf("%d",&temp);输入时 如果如数的数据不为整形出错,应该是进入下一次循环继续输入,为什么就成了那样的了.
找了一下无也没找出个原因来,望各位帮帮忙看看啊.跪谢




























...全文
774 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2009-03-22
  • 打赏
  • 举报
回复
可使用scanf函数的返回值判断成功读入了几个值~
当发生错误时,进行必要的忽略,16楼逐个字符忽略直到有合法数字;也可以gets或scanf("%*s")直接忽略该行剩余字符...
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
问题已,解决.谢谢各位.
lwouyang 2009-03-22
  • 打赏
  • 举报
回复
试下这个
1 #include <stdio.h>
2 main(){
3 int array[10];
4 int temp;
5 int i,j;
6 printf("input ten numbers(between -32768 and +32767):\n");
7 for(i=0;i <10;i++){
8 if(!scanf("%d",&temp)) {getchar();--i;continue;}
9 else
if(temp <-32768 || temp>32767){
10 i--;
11 printf("number must between -32768 and +32767\ntry again:\n");
12 continue;
13 }else{
14 array[i]=temp;
15 }
16 }
17 printf("your numbers:\n");
18 for(j=0;j <10;j++){
19 printf(" %d ",array[j]);
20 }
21
22 printf("\ngod bye\n");
23 }
为说明问题,排版没处理好。见谅!
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jamesontan 的回复:]
另外建议你用gdb 一步一步调式就知道问题在那里了
我现在没有linux机器,solaris上没看到这个问题,不好帮你看啦
[/Quote]
12楼的 gdb 是安装linux系统时系统自带的吗?如果不是的话在哪里能够下载到呢?又怎样安装?
我的本行是做java开发的,为了学一些基础的算法和一些数据结构的实现,还有liunx,才又拿起三年前的C.
指点指点,谢了.
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lwouyang 的回复:]
当scanf()无法读取到所要求的数据时,scanf()返回但不会对temp进行修改。
第二组数据当e时,scanf()读取失败返回,但不会对temp进行修改,所以temp一直保持上次的43的数值不变,貌似temp得到的都是43。
第三组数据一开始scanf()读取就失败,而temp又是一个不确定的数值(应该也是一个在-32768~32767之外的数,无法满足要求,所以始终通不过,变成scanf()一直读取失败的死循环。
以上浊见,不知是否正确。
[/Quote]
七楼的谢了.刚才做了个测试 得出redhatlinux下int型的缺省值尽然有这么大:1073828704
长见识了,可能是因为双核的才这么大的吧.
duzhizj 2009-03-22
  • 打赏
  • 举报
回复
输入g与temp类型不同吧。但为什么出现死循环我也不清楚。dev C上测试情况与楼主相同。
jamesontan 2009-03-22
  • 打赏
  • 举报
回复
另外建议你用gdb 一步一步调式就知道问题在那里了
我现在没有linux机器,solaris上没看到这个问题,不好帮你看啦
jamesontan 2009-03-22
  • 打赏
  • 举报
回复
input ten numbers(between -32768 and +32767):
1
2
f
your numbers:
1 2 2 2 2 2 2 2 2 2
god bye
你看看这个输出,再想想应该就知道原因了,呵呵
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
六楼的,我按照你的方法该了,还是不行.
还是同样的问题.
lwouyang 2009-03-22
  • 打赏
  • 举报
回复
解决的办法应该适当丢弃一些错误的输入,不要让其堵在了正确输入的前面。
tonforce 2009-03-22
  • 打赏
  • 举报
回复
我觉得你应该要对输入的是字符还是数字进行判断
如果你输入的是字符,for循环无法对字符进行判断,从而导致死循环。
你可以定义个bool型的函数来检测输入的是否数字。
lwouyang 2009-03-22
  • 打赏
  • 举报
回复
当scanf()无法读取到所要求的数据时,scanf()返回但不会对temp进行修改。
第二组数据当e时,scanf()读取失败返回,但不会对temp进行修改,所以temp一直保持上次的43的数值不变,貌似temp得到的都是43。
第三组数据一开始scanf()读取就失败,而temp又是一个不确定的数值(应该也是一个在-32768~32767之外的数,无法满足要求,所以始终通不过,变成scanf()一直读取失败的死循环。
以上浊见,不知是否正确。
breezes2008 2009-03-22
  • 打赏
  • 举报
回复
1 #include <stdio.h>
2 main(){
3 int array[10];
4 [color=#FF0000] long temp; [/color]
5 int i,j;
6 printf("input ten numbers(between -32768 and +32767):\n");
7 for(i=0;i <10;i++){
8 scanf("%Ld",&temp);
9 if(temp <-32768 || temp>32767){
10 i--;
11 printf("number must between -32768 and +32767\ntry again:\n");
12 continue;
13 }else{
14 array[i]=(int)temp;
15 }
16 }
17 printf("your numbers:\n");
18 for(j=0;j <10;j++){
19 printf(" %d ",array[j]);
20 }
21
22 printf("\ngod bye\n");
23 }
breezes2008 2009-03-22
  • 打赏
  • 举报
回复
   1 #include <stdio.h> 
2 main(){
3 int array[10];
4 long temp;
5 int i,j;
6 printf("input ten numbers(between -32768 and +32767):\n");
7 for(i=0;i <10;i++){
8 scanf("%Ld",&temp);
9 if(temp <-32768 || temp>32767){
10 i--;
11 printf("number must between -32768 and +32767\ntry again:\n");
12 continue;
13 }else{
14 array[i]=(int)temp;
15 }
16 }
17 printf("your numbers:\n");
18 for(j=0;j <10;j++){
19 printf(" %d ",array[j]);
20 }
21
22 printf("\ngod bye\n");
23 }
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jamesontan 的回复:]
呵呵,我在solaris上做过测试,没有发现你的死循环啊?
# ./11
input ten numbers(between -32768 and +32767):
g
your numbers:
0 0 0 0 0 0 0 0 0 0
god bye
[/Quote]
我该怎么办啊,我的Linux系统的问题吗?真的是憋死了.
我是不是该换系统啊,兄弟.
jamesontan 2009-03-22
  • 打赏
  • 举报
回复
呵呵,我在solaris上做过测试,没有发现你的死循环啊?
# ./11
input ten numbers(between -32768 and +32767):
g
your numbers:
0 0 0 0 0 0 0 0 0 0
god bye
buyiwangzi 2009-03-22
  • 打赏
  • 举报
回复
劳驾,我在线等待.
tonforce 2009-03-21
  • 打赏
  • 举报
回复
呵呵
还没睡的?
看看先

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧