Использование возвращаемого значения из scanf на языке программирования C в качестве проверки - PullRequest
2 голосов
/ 23 декабря 2009

Как вы используете возвращаемое значение из scanf, чтобы убедиться, что это двойное число, которое я получил?

double input;

do {  /* do this as long as it not a double */
  printf("Input?");
  scanf("%lf", &input);
} while(scanf("%lf", &input) != 1); /* this will not work */

Ответы [ 5 ]

5 голосов
/ 23 декабря 2009

scanf вернет количество назначенных предметов. В вашем случае, поскольку строка формата содержит только %lf, она вернет 1 именно в том случае, если вы получили double. Проблема с вашим кодом в том, что вы сначала вызываете scanf внутри цикла, который будет читать double из потока. Затем в вашем while состоянии вы снова вызываете scanf, но нет другого double для чтения, поэтому scanf ничего не делает.

То, как я написал бы ваш код, было бы примерно таким:

int no_assigned;
do {
    printf("Input?");
    no_assigned = scanf("%lf", &input);
} while (no_assigned != 1);

Дополнительная переменная существует потому, что мне кажется, что scanf - это код, который должен быть внутри цикла, а не в условии while, но это действительно личное предпочтение; вы можете исключить дополнительную переменную и переместить (отметить, переместить, а не копировать) вызов scanf внутри условия вместо этого.

РЕДАКТИРОВАТЬ: И вот версия с использованием fgets, что, вероятно, лучше:

double input;
char buffer[80];

do {
    printf("Input? ");
    fflush(stdout); // Make sure prompt is shown
    if (fgets(buffer, sizeof buffer, stdin) == NULL)
        break; // Got EOF; TODO: need to recognize this after loop
    // TODO: If input did not fit into buffer, discard until newline
} while (sscanf(buffer, "%lf", &input) != 1);
2 голосов
/ 23 декабря 2009

scanf () и друзья возвращают количество элементов ввода, которые были успешно сопоставлены и назначены. Нет информации, связанной с типом. Но так как вы указали lf в строке преобразования, вы получите двойное число - я думаю, что мне не хватает вашей точки зрения.

1 голос
/ 23 декабря 2009

Я думаю, это то, что вы пытаетесь сделать:

double input;

do {  /* do this as long as it not a double */
  printf("Input?");
} while(!scanf("%lf", &input));
1 голос
/ 23 декабря 2009

Как сказал Майкл, scanf () возвращает целое число, представляющее количество элементов, успешно прочитанных. Насколько я вижу из справочной страницы, вы не можете использовать возвращаемое значение, чтобы проверить, является ли прочитанное двойным или нет.

0 голосов
/ 23 декабря 2009

scanf () вернет номер введенного / предоставленного ввода. Он не вернет никакого результата, связанного с типом данных.

...