我不想做的是检查我的输入是否是数字然后继续,否则打印出错误的格式并要求输入新的输入。我得到的是无限循环打印“错误的格式”
这是我输入数字的函数:
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
}
}
当我运行程序时,我希望它看起来像这样:
号码:你好
- &GT;格式错误,请再试一次! &LT; -
号码: 4
继续......
答案 0 :(得分:1)
试试这个:(要注意有很多更好的方法可以做到这一点)
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
答案 1 :(得分:0)
尝试使用检查用户输入的循环并尝试将其解析为int。如果它没有成功,它可以继续询问用户输入,直到他们输入实际的int。
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
我认为问题在于,如果scanf()
由于EOF或输入流中存在非数字字符而失败,则当您下次调用它时该问题仍然存在,因此它再次失败,并且这种情况一直持续到程序资源耗尽或耐心耗尽为止。
至少,您需要区分:
如果您希望每行有一个号码,那么最好使用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()
的代码更难编写,因此请谨慎决定使用它。
请注意,原始代码在返回return 0;
的函数中有void
。代码应该被编译器拒绝。