Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2015年Visual Studio上的scanf_C_Visual Studio 2010_Visual Studio 2015_Printf_Scanf - Fatal编程技术网

2015年Visual Studio上的scanf

2015年Visual Studio上的scanf,c,visual-studio-2010,visual-studio-2015,printf,scanf,C,Visual Studio 2010,Visual Studio 2015,Printf,Scanf,我在VS2015中遇到了这段代码的问题,每次我输入用户名时,它都会发生严重破坏,如下所示: void loginForm() { char username[100], password[100]; printf("Username: "); scanf("%[^\n]", username); printf("%s", username); printf("Password: "); scanf("%[^\n]", password);

我在VS2015中遇到了这段代码的问题,每次我输入用户名时,它都会发生严重破坏,如下所示:

void loginForm() {
    char username[100], password[100];
    printf("Username: ");
    scanf("%[^\n]", username);
    printf("%s", username);
    printf("Password: ");
    scanf("%[^\n]", password);
    printf("%s", password);
}
我很困惑,因为在代码中,我想在要求用户输入密码之前先打印“用户名”,但正如您所看到的,我甚至没有在密码中键入任何内容,但正如您所看到的,它已经是这样了。 在VS2010上测试了代码,一切正常。我不知道发生了什么事


NB:代码是用C编写的,不是C++的。

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

要解决这个问题,可以在格式字符串的开头放一个空格,如下所示

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

请在百分号前面加空格:
“%[^\n]”
。另外,您不需要在
scanf
s中的
username
password
前面使用符号。很抱歉,我没有注意到符号。我把它拿走了。哇,真管用!您可能希望使用应答模式来回复更多关于正在发生的事情的信息,因为我无法将comment设置为应答:)函数
scanf
停止读取空格(如换行符)。输入缓冲区中的换行符不会复制到您提供的缓冲区中。因此,一个简单的
“%99s”
格式应该足以满足您的
scanf
调用。事实上,使用
“%[”
format会导致问题,因为它不会跳过前导空格。因此第二个
scanf
调用将读取上一个调用的换行符。@我知道,但是空格是否也算作空格?因为用户名和密码也可能由空格组成。关于第二个scanf,我确实输入了fflush(stdin)在每次扫描之后,我只是不在这里显示它们,够了吗?啊,是的,空格当然是一个空白字符。然后你的格式字符串需要包含一个前导空格,正如@user3386109所建议的那样,以丢弃前导空格(如前面的输入换行符)。谢谢你的回答和你花时间解释清楚!:)顺便说一句,你应该这样做(stdin)每次扫描后都能正常工作吗?@TenzoNakami根据C规范,
fflush
只允许在输出流和更新流(§7.21.5.2)上使用。但是,我让你来决定。好吧,我刚才试过了,但不起作用。那么,我就坚持你的答案吧!:)
scanf(" %[^\n]", password);
       ^ this space forces scanf to skip any leading whitespace, including newlines