2016-12-02 67 views
1
void loginForm() { 
    char username[100], password[100]; 
    printf("Username: "); 
    scanf("%[^\n]", username); 
    printf("%s", username); 
    printf("Password: "); 
    scanf("%[^\n]", password); 
    printf("%s", password); 
} 

我已经遇到的问题与此代码在VS2015,在那里每次我输入自己的用户名,它只是继续肆虐,像这样:scanf函数上的Visual Studio 2015年

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

我很困惑,因为在代码中,我希望先打印“用户名”,然后要求用户输入密码,但正如你所看到的,我甚至没有输入任何密码,但你可以看到它已经看起来像这样。 测试了VS2010上的代码,一切正常。我不知道发生了什么。

注意:代码是用C编写的,而不是C++。

+0

请在百分号前加空格:'“%[^ \ n]”'。另外,您不需要在'scanf'中的'username'和'password'前加上&符号。 – user3386109

+0

哎呀,对不起,我没有注意到&符号。我删除了那个。哇,那可行!您可能想要使用答案模式回复更多关于发生的事情的信息,因为我不能将注释设置为答案:) – TenzoNakami

+0

'scanf'函数停止读取空格符(如换行符)。输入缓冲区中的换行符不会被复制到您提供的缓冲区中。所以一个简单的''%99s''格式对于'scanf'调用应该足够了。事实上,使用''%[“'格式会导致问题,因为它不会跳过前导空格。所以第二个'scanf'调用将读取前一个调用的换行符。 –

回答

1

问题是"%[^\n]"格式说明符会将换行符留在输入缓冲区中。以下scanf不会跳过该换行符,因为%[]格式说明符默认情况下不会跳过前导空格。 (相比之下,大多数的格式说明像%s%d%f默认情况下,跳过空白。)

为了解决这个问题,你可以在格式字符串的开头加一个空格,像这样

scanf(" %[^\n]", password); 
    ^this space forces scanf to skip any leading whitespace, including newlines 
+0

感谢您的答案和您的时间来解释事情! :)顺便说一句,在每次scanf之后fflush(stdin)都能正常工作吗? – TenzoNakami

+0

@TenzoNakami根据C规范,“fflush”只允许在输出流和更新流(§7.21.5.2)上使用。但[微软允许在输入流](https://stackoverflow.com/a/34247021/3386109),所以我留给你决定。 – user3386109

+1

嗯,我刚刚尝试过,但不起作用。那么,我会坚持你的答案! :) – TenzoNakami