C: Проверка Scanf - PullRequest
       1

C: Проверка Scanf

0 голосов
/ 06 апреля 2011

Скажите, у меня есть

[количество комнат]

[название комнаты] [номер элемента1] [номер элемента2]

...

[количество дверей]

[название комнаты] [L | R | U | D] [название комнаты]

...

[начальная комната] [выходная комната]

[move1]

[Move2]

....

говорят, что я использую scanf,

scanf(" %d", &roomCount);

scanf(" %s %d %d", room_name, &item1No, &item2No);

и т.д ...

Как мне проверить, что пользователь ввел правильный ввод?

Спасибо

Ответы [ 4 ]

4 голосов
/ 06 апреля 2011

Использование scanf почти всегда является плохой идеей: оно не делает различий между символами новой строки и другими пробелами, что позволяет очень просто не знать, где вы находитесь, независимо от того, что вы пытаетесь проанализировать. Возможно, лучше: читать в строках, используя fgets, и переводить каждую строку в sscanf, проверяя возвращаемое значение, чтобы убедиться, что вы получили то, что искали. В качестве альтернативы используйте реальный синтаксический анализатор: создайте свой собственный, используя генератор синтаксического анализатора, такой как flex, или используйте какой-нибудь XML для формата данных и используйте синтаксический анализатор XML или что-то в этом роде.

Вероятно, было бы целесообразно спроектировать формат данных таким образом, чтобы синтаксическому анализу было труднее выйти из синхронизации, не замечая этого, и сделать структуру данных более понятной для читателей-людей.

3 голосов
/ 06 апреля 2011

Ну, scanf возвращает количество успешно прочитанных элементов.Вы можете сравнить это значение после каждого чтения с количеством ожидаемых элементов.

Очень простой пример

#include <stdio.h>

int main() {
    int v;
    if ( scanf( "%d", &v ) != 1 ) {
      /* we know something went wrong */
    }    
}
2 голосов
/ 06 апреля 2011
int input ;
if (scanf("%d", (&input)) == 0)
{
    while (getchar() != '\n');    // Removes the offending characters that causes 
                                    // scanf to struck at error occured on future 
                                    // operations.
    printf(" \n Invalid value.\n") ;
}

Итак, если вы хотите, чтобы пользователь снова запрашивал ввод, сохраните его в while и разбейте его, если возвращаемое значение scanf не равно 0 . Надеюсь, что это дает вам представление.

0 голосов
/ 06 апреля 2011

scanf не очень хороший инструмент для интерактивного ввода.

Лучше прочитать всю строку ввода как текст, используя fgets, затем разбить ее на токены, используя strtok, и преобразовать каждое значение, используя strtol или strtoul. Это даст вам больше контроля, и вам не придется беспокоиться о том, что вы ошибочно примете неверный ввод (например, если кто-то введет «10p», scanf успешно преобразует и назначит 10 и оставит p в входной поток, чтобы запутать следующее чтение; вы, вероятно, захотите полностью отклонить весь ввод).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...