我试图要求输入。如果它不是整数,则应再次要求输入,这就是为什么我使用如下递归。
#include <stdio.h>
void hi() {
int a;
printf("Input a: ");
if(scanf("%d", &a) == 0)
a = -1;
switch(a) {
case 1:
printf("Hello!");
break;
case 0:
return;
default:
hi();
return;
break;
}
}
int main()
{
hi();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
Input a: *asd* Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a: Input a:
输入非整数值时,hi()中的scanf为什么不起作用(它不会停止printf并询问我的输入)我该如何解决?
对于需要处理无效输入的交互式程序,您不想使用scanf,因为它无法从解析错误中恢复。改用fgets / sscanf的组合。
同样,最好不要使用递归来解决可以使用迭代解决的问题。维护和调试容易得多。您还将获得更好的成绩!
int a = 0 ;
while ( 1 ) {
char buff[200] ;
printf("Enter ...") ;
if ( !fgets(buff, sizeof(buff), stdin) ) { perror("EOF") ; exit(1) ; }
if ( sscanf(buff, " %d", &a) == 1 ) break ; // All Good
} ;
Run Code Online (Sandbox Code Playgroud)
原始代码“ scanf”将在第一个解析错误时反复失败,递归导致全部堆栈被使用,并且程序崩溃。
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |