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