2014-11-21 46 views
0

我是C初学者,我正在尝试创建一个与用户输入一起工作的程序。 问题是,当用户输入不正确的数据时,程序以无限错误循环结束(说“输入数据不正确”)。 我试着fflush并用空字符串清除用户输入,但它只是以某种方式不起作用。C - 无限的错误循环(新手)

MAIN.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; 
} 
+0

你有两个'}',所以第二个被关闭while循环。 – NSimon 2014-11-21 09:40:55

+0

@NSimon我认为while循环正确关闭,我已经修复了缩进。 – 2014-11-21 09:44:07

+0

试过程序,这里没有无限循环...如果你在Linux上测试它,在最终输入后​​尝试Ctrl + D。还要确保函数'nd'和'nsd'终止。 – 2014-11-21 09:45:14

回答

1

发生此问题,因为调用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.

+0

哈,那会教我编码而不进行测试。 'if(!* end1 ||!* end2)'应该是'if(* end1 || * end2)'。现在修复。 – 2014-11-21 10:50:27