【发布时间】:2016-12-02 08:33:20
【问题描述】:
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 上测试了代码,一切正常。我不知道发生了什么。
注意:代码是用 C 编写的,而不是 C++。
【问题讨论】:
-
尝试在百分号前加一个空格:
" %[^\n]"。此外,您不需要在scanfs 中的username和password前面添加与号。 -
糟糕,很抱歉我没有注意到与号。我删除了那个。哇,这行得通!您可能想使用回答模式来回复有关正在发生的事情的更多信息,因为我无法将评论设置为答案:)
-
scanf函数停止读取空格(如换行符)。输入缓冲区中的换行符不会被复制到您提供的缓冲区中。所以一个简单的"%99s"格式应该足以满足您的scanf调用。事实上,使用"%["格式会导致问题,因为它不会跳过前导空格。所以第二个scanf调用将读取前一个调用的换行符。 -
@Someprogrammerdude 我知道这一点,但是空格算作空格吗?由于用户名和密码也可能包含空格。还有关于第二个scanf,我确实在每个scanf之后都放了fflush(stdin),我只是不在这里展示它们,够了吗?
-
啊,是的,空格当然是空格字符。然后,您的格式字符串需要包含 @user3386109 建议的前导空格,以丢弃前导空格(如前面的输入换行符)。
标签: c visual-studio-2010 visual-studio-2015 printf scanf