c - C 编程重复scanf直到输入数字

  显示原文与译文双语对照的内容
0 0

我不要做的是检查输入是一个数字,然后继续,否则打印出错误的格式并要求新的输入。 我得到的是无限循环打印"错误的格式""

这是我对输入编号的函数:


void input_number(int *number)
{

 printf("Number:");

 if ( scanf("%d", number) == 1 )
 return 0;
 else
 {
 printf("-> Wrong format, try again! <-n");
 input_number(number);//start over
 }
}

运行程序时,我希望它看起来像这样:

数字: hello

-> 格式错误,请重试 ! <-

号码:

然后继续。

时间: 原作者:

0 0

问题是,如果 scanf() 由于 eof 或者输入流中有一个非数字字符,那么问题就会失败。

至少,你需要区分:

  1. eof ( 无需再阅读)
  2. 错误( more,但下一个字符至少不是数字的一部分)

如果你希望每行都有一个数字,那么最好使用 fgets()sscanf() 。 如果你对每行的数字都很满意,那么你必须工作一点。 你还应该从函数中返回一个值,以指示它是否成功。


int input_number(int *number)
{
 char line[4096];

 while (printf("Number:")> 0 && fgets(line, sizeof(line), stdin)!= 0)
 {
 if (sscanf(line,"%d", number) == 1)
 return 0;
 printf("-> Wrong format, try again! <-n");
 }
 return EOF;
}

int input_number(int *number)
{
 while (printf("Number:")> 0 && scanf("%d", number)!= 1)
 {
 int c;
 if (feof(stdin) || ferror(stdin))
 return EOF;
 printf("-> Wrong format, try again! <-n");
 while ((c = getchar())!= EOF && c!= 'n')
 ;
 if (c == EOF)
 return EOF;
 }
 return 0;
}

注意正确使用 feof() ;I/O 操作失败并且代码需要区分 eof 和 I/O 错误和格式错误。

在第二个函数中,如果 printf() 失败,则错误地告诉你读取数字。 如果这是一个问题,添加额外的测试,但是代码比使用 fgets() 编写代码更难。

请注意,原始代码在返回 void的函数中有 return 0; 。 代码应该被编译器拒绝。

原作者:
0 0

试试:( 注意有很多更好的方法来做到这一点)


void input_number(int *number)
{
 int flag=1;
 printf("Number:");

 while(flag==1){
 if ( scanf("%d", &number) == 1 ){//also you were missing & specifier
 flag = 0;
//return 0;
 }else{
 printf("-> Wrong format, try again! <-n");
 getchar();//to catch the enter from the input -- make sure you include stdlib.h

 }
 }

 return 0;
}

输出:


Number: f
-> Wrong format, try again! <-
Number: f
-> Wrong format, try again! <-
Number: d
-> Wrong format, try again! <-
Number: d
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: s
-> Wrong format, try again! <-
Number: 6

0 0

此时你可能知道代码中存在很少的缺陷,递归不是最好的想法。 这一项尝试使你的代码工作 ,漂亮或者不。


void input_number(int *number)
{

 printf("Number:");

 if ( scanf("%d", number) == 1 )
 return 0;
 else
 {
 scanf("%*s");/* <--this will read and discard whatever caused scanf to fail */
 printf("-> Wrong format, try again! <-n");
 input_number(number);//start over
 }
}

原作者:
...