Как я могу исправить этот цикл while, вложенный в if-else?

В настоящее время я работаю над некоторым кодом, и я знаю, что с ним что-то не так. Мой код предлагает пользователю ввести имя и сохраняет его в виде строки, используя fgets () or sscanf (). Если пользователь вводит что-то неправильно (то есть числа или буквенно-цифровые регистры), он должен вывести сообщение об ошибке и запросить ввод снова, пока пользователь не введет правильный ввод. Также я инициализировал:

char name [47];

printf ( "Name: " );

//some code dealing with newline character with the use of fgets

if ( (sscanf (name, %s, name)) == 1 )
    //some code dealing with this condition
else {
    do {
        printf ( "ERROR: Invalid name. Name should consist of letters only.\n" );
        printf ( "Name: " );
        if (fgets ( name, sizeof (name), stdin ) == '\0' )
            //some code dealing with EOF
    } while ((sscanf (name, %s, name)) != 1);
}

Кто-нибудь может сказать мне, что случилось?


person Sakamoto    schedule 27.08.2013    source источник
comment
Вы пропустили кавычки вокруг %s.   -  person Barmar    schedule 27.08.2013


Ответы (1)


char name[47];
char line[4096];

while (printf("Name: ") > 0 && fgets(line, sizeof(line), stdin) != 0)
{
    if (sscanf(line, "%46s", name) != 1)
        ...empty line?...
    else if (valid_name(name))
        break;
    printf("Error: invalid name (%s). Name should consist of letters only.\n", name);
}

Вы забыли, что printf() возвращает количество напечатанных символов? Что ж, большинство людей не очень часто проверяют его результат, но в данном контексте это полезно делать. Тест может быть != 6, а не только > 0, но на практике любой из них, скорее всего, будет работать нормально.

Обратите внимание на использование "%46s" для чтения значения в name без риска переполнения буфера. Также обратите внимание, что sscanf() не будет читать новую строку в name.

person Jonathan Leffler    schedule 27.08.2013