递归scanf死循环

tan*_*216 2 c recursion

我试图要求输入。如果它不是整数,则应再次要求输入,这就是为什么我使用如下递归。

#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并询问我的输入)我该如何解决?

das*_*h-o 5

对于需要处理无效输入的交互式程序,您不想使用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”将在第一个解析错误时反复失败,递归导致全部堆栈被使用,并且程序崩溃。