Scanf игнорирует некоторые типы входов - PullRequest
0 голосов
/ 11 ноября 2019

в моей программе я использую функцию 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. Если я введу два или три неверных значения, это сработает;но когда input имеет только одно значение, он ничего не делает и ждет второго ... например, когда я ввожу:

l o b

, это работает;но когда я ввожу

a

, он ждет второго значения.

Есть идеи, почему это не работает?

1 Ответ

0 голосов
/ 11 ноября 2019

Попробуйте использовать 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;
}
...