我是新手,提个很弱的问题。

时间:2022-02-02 04:32:11
在输入数字时都能进行合法性判断,为什么输入字母时就死循环了,想不通,请教一下。
main()
{
int logic;
long num;
logic=1;
while(logic)
{
printf("input a number:\n");
scanf("%ld",&num);
if((num<0)||(num>99999))
  printf("Input error,please input again:");
else
  logic=0;
  printf("\n");
}
}

12 个解决方案

#1


一个字符的内存是 1 个字节
 和long所占用内存大小都不一样、

 输入一个字母,占了低位的8个bit  01000000  (只是一个比方)

 那么高位用什么来填充,是不确定的,
 。。。
 
 没有按照要求来输入字符,(非法字符的出现) 的情况下

 我觉得任何解释都不会太恰当

#2


当然最好的补救办法就是:
 
 对非法字符进行过滤

#3


scanf("%ld",&num);
flushall();

#4


scanf("%ld",&num);
==>
if (scanf("%ld",&num)==0)
flushall();

#5


你定义了一个long型的num,在32位机内它占4个字节,但char只占一个字节,把一个char赋给一个long型,得到的num是一个随机数,所以会导致循环出现.

#6



 tailzhou(尾巴) 
能不能具体指点一下,flushall()有什么作用?什么时候用?

#7


函数名: flushall 
功  能: 清除所有缓冲区 
用  法: int flushall(void); 
程序例: 

#include <stdio.h> 

int main(void) 

   FILE *stream; 

   /* create a file */ 
   stream = fopen("DUMMY.FIL", "w"); 

   /* flush all open streams */ 
   printf("%d streams were flushed.\n", 
   flushall()); 

   /* close the file */ 
   fclose(stream); 
   return 0; 


#8


补:
返回值:返回被清楚的缓冲区的数目
详细说明:
1.函数将所有输入缓冲区清空,所有其后的输入函数都需要重新重文件读入新数据。
2.函数将所有输入缓冲区的内容写入对应的文件中,

#9


我都是查函数手册的。具体有什么用我还不太清楚。有待tailzhou(尾巴) 解答

#10


#include <stdio.h>
int main(int argc ,char** argv)
{
int logic;
long num;
num=-1;
logic=1;
while(logic)
{
num=-1;
printf("input a number:\n");
fflush(stdin);
scanf("%ld",&num);

if((num<0)||(num>99999))
{ printf("Input error,please input again:");
logic=1;
}
else 
{
logic=0;
}
printf("\n");
}
}

#11


输入字母的时候
scanf("%ld",&num)读取不到num的值,输入的字母一直存在缓冲区里面。
所以造成了死循环,
用flushall把缓冲区的内容清除就可以了。

#12


谢谢了,都是高手,我要好好学学了。

#1


一个字符的内存是 1 个字节
 和long所占用内存大小都不一样、

 输入一个字母,占了低位的8个bit  01000000  (只是一个比方)

 那么高位用什么来填充,是不确定的,
 。。。
 
 没有按照要求来输入字符,(非法字符的出现) 的情况下

 我觉得任何解释都不会太恰当

#2


当然最好的补救办法就是:
 
 对非法字符进行过滤

#3


scanf("%ld",&num);
flushall();

#4


scanf("%ld",&num);
==>
if (scanf("%ld",&num)==0)
flushall();

#5


你定义了一个long型的num,在32位机内它占4个字节,但char只占一个字节,把一个char赋给一个long型,得到的num是一个随机数,所以会导致循环出现.

#6



 tailzhou(尾巴) 
能不能具体指点一下,flushall()有什么作用?什么时候用?

#7


函数名: flushall 
功  能: 清除所有缓冲区 
用  法: int flushall(void); 
程序例: 

#include <stdio.h> 

int main(void) 

   FILE *stream; 

   /* create a file */ 
   stream = fopen("DUMMY.FIL", "w"); 

   /* flush all open streams */ 
   printf("%d streams were flushed.\n", 
   flushall()); 

   /* close the file */ 
   fclose(stream); 
   return 0; 


#8


补:
返回值:返回被清楚的缓冲区的数目
详细说明:
1.函数将所有输入缓冲区清空,所有其后的输入函数都需要重新重文件读入新数据。
2.函数将所有输入缓冲区的内容写入对应的文件中,

#9


我都是查函数手册的。具体有什么用我还不太清楚。有待tailzhou(尾巴) 解答

#10


#include <stdio.h>
int main(int argc ,char** argv)
{
int logic;
long num;
num=-1;
logic=1;
while(logic)
{
num=-1;
printf("input a number:\n");
fflush(stdin);
scanf("%ld",&num);

if((num<0)||(num>99999))
{ printf("Input error,please input again:");
logic=1;
}
else 
{
logic=0;
}
printf("\n");
}
}

#11


输入字母的时候
scanf("%ld",&num)读取不到num的值,输入的字母一直存在缓冲区里面。
所以造成了死循环,
用flushall把缓冲区的内容清除就可以了。

#12


谢谢了,都是高手,我要好好学学了。