C语言中的无限循环码
在下面的程序中,我尝试输入一个介于C语言中的无限循环码,c,infinite-loop,C,Infinite Loop,在下面的程序中,我尝试输入一个介于1到100之间的数字,但如果在scanf()语句的执行期间输入a
1
到100
之间的数字,但如果在scanf()
语句的执行期间输入a
“string”
(如s或sova
),则会创建一个无限循环。所以我试着做。。。。当我输入一个字符串或字符时,它会向我显示一条消息,如“输入的值错误。请再次输入”,然后它会再次输入…Thanx
#包括
int main()
{
INTA;
scanf(“%d”和“&a”);
而(!(a>=1&&a
您需要检查scanf的返回值
如果用户未输入整数,则需要接受输入。scanf
函数将持续显示非整数,请重试。因此,如果scanf
返回0,则需要处理它
当您使用scanf时,您使用的是缓冲输入,这意味着当您输入一个值时,请说“123”,然后按enter键,“123”加上结束字符(enter)将全部添加到缓冲区。scanf
然后删除123,因为%d
指定应读取一个整数,但如果用户输入无效内容,如字符串,则缓冲区将不会清空
从键盘读取输入的更好方法是使用fgets(),其中指定了要读取的最大长度。一旦有了输入,就可以使用sscanf()从中检索数值。输入之前不会刺激您的输入
char buffer[128];
fgets( buffer, 128, stdin );
sscanf( buffer, "%d", &a );
此外,请始终检查函数的返回值作为经验法则,以便在函数失败时可以执行适当的操作。试试这个
#include <stdio.h>
#define FLUSH while (getchar() != '\n') // macro to eat invalid input
int main (void) {
int a = 0;
printf ("Enter an integer: ");
scanf("%d", &a);
while (a < 1 || a > 100) {
FLUSH;
printf("Invalid input. Please try again: ");
scanf("%d",&a);
}
printf("You entered %d.\nThanks!\n", a);
return 0;
}
#包括
#定义FLUSH while(getchar()!='\n')//宏以读取无效输入
内部主(空){
int a=0;
printf(“输入一个整数:”);
scanf(“%d”和“&a”);
而(a<1 | | a>100){
脸红
printf(“无效输入。请重试:”;
scanf(“%d”和“&a”);
}
printf(“您输入了%d。\n银行!\n”,a);
返回0;
}
您的代码显示了几个需要更改的编码习惯:
在main()
的参数列表中包括(void)
在二进制运算符的两边留空格:而(!(a>=1&&a=1&&a 100)
,后者更容易阅读
在需要时提示用户输入。不要让光标停留在空行上,没有指示用户要做什么
在提示中使用正确的语法和大小写。没有理由在编程中偷懒
如果scanf的返回值不等于您希望用户输入的项目数,请读取输入缓冲区的所有字符,直到出现“\n”。但是,您可以使用如下函数包装循环,而不是将整个循环反复复制到代码中用户应输入的位置:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void input(const char *format,...)
{
va_list ap;
int r;
/* number of items [to read] */
int noi=0;
for(r=0;r<strlen(format)-1;r++)
{
if(format[r]=='%')
{
if(format[r+1]!='%')
noi++;
else
r++;
}
}
do
{
va_start(ap,format);
r=vscanf(format,ap);
va_end(ap);
if(r!=noi)
{
switch(r)
{
case EOF:
case 0:
printf("All wrong, try again!\n");
break;
default:
printf("Unexpected value after item no %d!\n",r);
}
while(getc(stdin)!='\n');
}
else
break;
} while(1);
}
#包括
#包括
#包括
无效输入(常量字符*格式,…)
{
va_列表ap;
INTR;
/*项目数[待阅读]*/
int noi=0;
对于(r=0;rWhy notdo…while
?首先,无法获得使用while循环的原因。您可以简单地使用if和else as。@iPhoneDev用户可能会不断给出错误的值我不得不说,这两个注释都无法回答问题或提供问题的见解。^^^^^如果您不输入int
值,则scanf不会消耗输入,而该输入仍然是stdin buffer您需要通过读取未扫描的字符来刷新该缓冲区--Read:我详细解释了相同的问题,但是%d
转换规范确实跳过了前导空格;在这种情况下,换行符仍然在缓冲区中并不重要。
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void input(const char *format,...)
{
va_list ap;
int r;
/* number of items [to read] */
int noi=0;
for(r=0;r<strlen(format)-1;r++)
{
if(format[r]=='%')
{
if(format[r+1]!='%')
noi++;
else
r++;
}
}
do
{
va_start(ap,format);
r=vscanf(format,ap);
va_end(ap);
if(r!=noi)
{
switch(r)
{
case EOF:
case 0:
printf("All wrong, try again!\n");
break;
default:
printf("Unexpected value after item no %d!\n",r);
}
while(getc(stdin)!='\n');
}
else
break;
} while(1);
}