控制台未正确读取输入字符串

Dan*_*l H -1 c++ console winapi c++17

我试图通过执行C++风格来读取控制台输入

int main()
{
    std::string str;
    std::getline(std::cin, str);
    // also tested: std::cin >> str;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和C风格

int main()
{
    char* str = new char[20];
    scanf_s("%s", str);
    delete[] str;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我输入一个字符串然后按回车键,控制台中的光标将不会跳转到下一行,它会跳转到输入命令所在行的第一列.输入第二个键会导致错误:

执行C++样式代码后的错误消息框:

Debug Assertion Failed!

Program: D:\_extern\Test\Test.exe
File: minkernel\crts\ucrt\src\appcrt\lowio\read.cpp
Line: 259

Expression: static_cast<void const*>(source_buffer) == static_cast<void const*>(result_buffer)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
Run Code Online (Sandbox Code Playgroud)

执行C风格代码后出错:

Exception triggered at 0x00007FF95C9398E9 (ucrtbased.dll) in Test.exe: 0xC0000005: Access violation when writing at position 0x0000019155DF1000.
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?

Bar*_*mar 5

你没有scanf_s()正确地打电话,你把它称为普通的scanf().从文档:

不像scanfwscanf,scanf_swscanf_s需要类型的所有输入参数中指定的缓冲区大小c,C,s,S其被包围在或字符串控制集合[].字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后.例如,如果您正在读取字符串,则该字符串的缓冲区大小将按如下方式传递:

char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你需要写:

scanf_s("%s", str, 20);
Run Code Online (Sandbox Code Playgroud)