gpt4 book ai didi

C - 无限错误循环(新手)

转载 作者:行者123 更新时间:2023-11-30 15:27:20 24 4
gpt4 key购买 nike

我是 C 初学者,我正在尝试创建一个处理用户输入的程序。问题是,当用户输入不正确的数据时,程序会以无限错误循环结束(显示“输入数据不正确”)。我尝试了 fflush 并用空字符串清除用户输入,但它只是不知何故不起作用。

主.c:

#include <stdio.h>
#include "nd.h"
#include "nsd.h"
int num1;
int num2;
int a;
//char *p;

int main()
{
while(!feof(stdin))
{
if(scanf("%d %d",&num1,&num2)==2)
{
if ((nd(num1)==1) && (nd(num2)==1))
{
printf("%s\n", "prime");
}
else
{
a=nsd(num1, num2);
printf("%d\n", a);
}
}
else
{
fprintf(stderr, "Incorrect input data...");
//fflush(stdin);
//scanf ("%s",p);
}
}
printf("%s\n", "DONE");
return 1;
}

nd.c:

#include "nd.h"

#include <math.h>
#include <stdlib.h>

int nd(int a) {
// calculate greatest divisor of "a"
// nd equals 1, if it is prime
int ret;
int min_sqrt;

if (a == 1) {
ret = 1;
} else {
min_sqrt = abs(a) / 2;
for (ret=min_sqrt; ret>1; ret--) {
if ((a % ret)==0) {
break;
}
}
}
return ret;
}

最佳答案

出现此问题的原因是对 scanf("%d %d",...) 的调用仅匹配由空格分隔的两个整数。其他任何内容都将保留在输入缓冲区中。如果你的程序循环而不清除缓冲区,同样的事情将会再次发生。

您可以通过取消注释 scanf("%s",p); 并将 char *p; 更改为 char p[100 ]; 所以对 scanf() 的调用实际上有地方可以存放结果。

但是,这并不是一个理想的解决方案。格式字符串 %s 在调用 scanf() 时本质上是不安全的,因为它将匹配任意长度的非空白字符序列。这意味着无论您将 p[] 缓冲区设置多大,您的程序都容易受到缓冲区溢出的影响。

您当然可以通过使用 %99s 等格式字符串限制输入长度来解决此问题。但是,在处理交互式用户输入时,通常最好采用不同的方法,例如:

#include <stdlib.h>
char input[100], *end1, *end2;
int num1, num2, accept;

:

while (1) {
scanf("%99s",input);
num1 = strtol(input,&end1,10);
scanf("%99s",input);
num2 = strtol(input,&end2,10);
if (*end1 || *end2) puts("Illegal input :( Try again");
else break;
}

另外,请阅读this item in the comp.lang.c FAQ.

关于C - 无限错误循环(新手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27058218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com