C++ Win32 API控制台光标在WriteConsole之后不移动
因此,当我尝试使用以下代码从控制台读取std::wstring时C++ Win32 API控制台光标在WriteConsole之后不移动,c++,c++11,winapi,C++,C++11,Winapi,因此,当我尝试使用以下代码从控制台读取std::wstring时 std::wstring string; wchar_t c; DWORD u; do { ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL); } while (u && (c == L' ' || c == L'\n')); do { string.append(1, c); ReadConsole(G
std::wstring string;
wchar_t c;
DWORD u;
do {
ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && (c == L' ' || c == L'\n'));
do {
string.append(1, c);
ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && c != L' ' && c != L'\n');
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), string.data(), string.length(), &u, NULL);
写入字符串后,光标位置不会移动,因此如果再次调用WriteConsole(),它将写入刚刚写入的字符串上方。
有什么解决方法吗?当
ReadConsole
读取stdin时,它会将\r\n
附加到字符串中。您只在条件中排除了\n
<代码>“字符串\r”将被传递到WriteConsole
,而\r
将光标返回到行首。
请尝试以下代码:
#include <windows.h>
#include <iostream>
#include <string>
int main(int argc, char** argv)
{
std::wstring string;
wchar_t c;
DWORD u;
do {
ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && (c == L' ' || c == L'\n'));
do {
string.append(1, c);
ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &u, NULL);
} while (u && c != L' ' && c != L'\n' && c != L'\r');
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), string.data(), string.length(), &u, NULL);
return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
std::wstring字符串;
wchar_t c;
德沃德·u;
做{
ReadConsoleW(GetStdHandle(标准输入句柄),&c,1,&u,NULL);
}而(u&(c==L'| | c==L'\n');
做{
追加(1,c);
ReadConsoleW(GetStdHandle(标准输入句柄),&c,1,&u,NULL);
}而(u&&c!=L'&&c!=L'\n'&&c!=L'\r');
WriteConsoleW(GetStdHandle(STD_输出_句柄),string.data(),string.length(),&u,NULL);
返回0;
}
为什么要使用ReadConsole()
而不是std::cin>>字符串代码>?为什么要使用WriteConsole()
而不是std::cout?您所描述的并不是文档化的工作方式:“WriteConsole函数在当前光标位置将字符写入控制台屏幕缓冲区。当写入字符时,光标位置向前移动。StCySoCurrurSurvivSturn设置当前光标位置。“我正在编写WiAPI控制台函数的包装器,我不想使用C++ I/O。是的,问题是光标没有前进。这是因为在代码<字符串String。
以\r
结尾您好,@Mattia Gregnanin这能解决您的问题吗?如果您有任何问题,请随时告诉我