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++样式代码后的错误消息框:
Run Code Online (Sandbox Code Playgroud)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.
执行C风格代码后出错:
Run Code Online (Sandbox Code Playgroud)Exception triggered at 0x00007FF95C9398E9 (ucrtbased.dll) in Test.exe: 0xC0000005: Access violation when writing at position 0x0000019155DF1000.
可能是什么问题呢?
你没有scanf_s()正确地打电话,你把它称为普通的scanf().从文档:
不像
scanf和wscanf,scanf_s并wscanf_s需要类型的所有输入参数中指定的缓冲区大小c,C,s,S其被包围在或字符串控制集合[].字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后.例如,如果您正在读取字符串,则该字符串的缓冲区大小将按如下方式传递:Run Code Online (Sandbox Code Playgroud)char s[10]; scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
所以在你的情况下,你需要写:
scanf_s("%s", str, 20);
Run Code Online (Sandbox Code Playgroud)