Scanf忽略某些输入类型

问题描述 投票:0回答:1

在我的程序中,我像这样使用scanf函数:

        if(((scanf("%c %d %d",&zp, &min, &max)) != 3) 
            || (zp != 'c' && zp != 'l')  || min < 0 || min > max){
            if (! feof (stdin)){
                printf("Wrong input.\n");
            }
            else{
                return 1;
            }
        }

所以我希望,当我输入错误的输入,而不是EOF时,将触发printf。如果我输入两个或三个错误值,它可以工作;但是当输入只是一个值时,它什么也不做,并等待第二个值...例如,当我输入:

l o b

有效;但是当我输入

a

它等待第二个值。

任何想法为什么它不起作用?

c scanf
1个回答
0
投票

考虑使用fgets读取一行。sscanf可用于解析行。sscanf的返回可用于开关中以显示扫描的项目。

#include <stdio.h>
#include <string.h>

int main ( void) {
    char line[256] = "";
    char zp = 0;
    char extra = 0;
    int result = 0;
    int min = 0;
    int max = 0;

    printf ( "enter char min max (or done)\n");
    while ( fgets ( line, sizeof line, stdin)) {
        if ( 0 == strcmp ( line, "done\n")) {
            return 0;
        }

        result = sscanf ( line, " %c %d %d %c",&zp, &min, &max, &extra);
        switch ( result) {
            case 0:
                printf ( "unable to scan any values\n");
                break;
            case 1:
                printf ( "scaned zp: %c\n", zp);
                break;
            case 2:
                printf ( "scaned zp: %c and min: %d\n", zp, min);
                break;
            case 3:
                printf ( "scaned zp: %c min: %d and max: %d\n", zp, min, max);
                if ( min < 0) {
                    printf ( "problem! min %d is LESS than 0\n", min);
                }
                if ( min > max) {
                    printf ( "problem! min %d is GREATER than max %d\n", min, max);
                }
                break;
            case 4:
                printf ( "too many values scaned!\n");
                break;
            default:
                printf ( "unable to scan any values\n");
                break;
        }
        printf ( "enter char min max (or done)\n");
    }
    fprintf ( stderr, "fgets problem\n");
    return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.