扫描 Visual Studio 2015

scanf on 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

我很困惑,因为在代码中,我想在要求用户输入密码之前先打印 "Username",但如您所见,我什至没有输入任何密码但正如您所见,它已经看起来像那样了。 在 VS2010 上测试了代码,一切正常。我不知道发生了什么。

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

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

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

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