scanf в Visual Studio 2015

void loginForm() {
    char username[100], password[100];
    printf("Username: ");
    scanf("%[^\n]", username);
    printf("%s", username);
    printf("Password: ");
    scanf("%[^\n]", password);
    printf("%s", password);
}

У меня были проблемы с этим кодом в VS2015, где каждый раз, когда я вводил свое имя пользователя, это просто приводило к хаосу, например так:

Username: Tenzo
Password: Tenzo╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Tenzo

Я в замешательстве, так как в коде я хочу сначала напечатать "Имя пользователя", прежде чем попросить пользователя ввести свой пароль, но, как вы можете видеть, я даже ничего не вводил в пароль, но, как вы уже можете видеть, выглядело так. Протестировал код на VS2010 и все работает просто отлично. Я не знаю, что происходит.

NB: код написан на C, а не на C++.

1 ответ

Решение

Проблема в том, что "%[^\n]" спецификатор формата оставит символ новой строки во входном буфере. Следующие scanf не будет пропускать эту новую строку, потому что %[] спецификатор формата по умолчанию не пропускает первые пробелы. (Напротив, большинство спецификаторов формата, таких как %s, %d а также %f по умолчанию пропускайте пробелы.)

Чтобы решить проблему, вы можете поставить пробел в начале строки формата, например

scanf(" %[^\n]", password);
       ^ this space forces scanf to skip any leading whitespace, including newlines
Другие вопросы по тегам