wchar_t含空格用户名输入问题求助:std::wcin无法读取完整内容
解决wchar_t类型读取带空格用户名的问题
你遇到的问题是因为std::wcin >> username会以空白字符(空格、换行、制表符等)作为输入分隔符,所以只能读取到第一个空格前的内容。其实C++标准库提供了宽字符版本的getline,完全可以用来处理带空格的宽字符输入,下面给两种解决方案:
方案一:继续使用wchar_t数组
如果坚持用固定长度的wchar_t数组,需要先清空输入缓冲区中残留的换行符(避免getline直接读取空内容),然后调用宽字符流的getline方法:
#include <iostream> #include <limits> // 用于std::numeric_limits wchar_t window_title[50] = L"Krogex: "; std::wcout << L"Input window " << i + 1 << L"s username: " << std::endl; wchar_t username[20]; // 忽略输入缓冲区中所有字符直到换行符(清除之前输入残留的换行) std::wcin.ignore(std::numeric_limits<std::streamsize>::max(), L'\n'); // 读取带空格的输入到wchar_t数组,第二个参数是数组的最大容纳数(含终止符) std::wcin.getline(username, sizeof(username)/sizeof(wchar_t));
方案二:使用std::wstring更安全(推荐)
固定长度的数组容易出现缓冲区溢出问题,推荐用std::wstring来存储宽字符字符串,它会自动管理内存,代码也更简洁:
#include <iostream> #include <string> #include <limits> wchar_t window_title[50] = L"Krogex: "; std::wcout << L"Input window " << i + 1 << L"s username: " << std::endl; std::wstring username; // 清除输入缓冲区残留的换行符 std::wcin.ignore(std::numeric_limits<std::streamsize>::max(), L'\n'); // 直接读取带空格的宽字符输入到std::wstring std::getline(std::wcin, username); // 如果需要转成const wchar_t*类型,可调用c_str()方法 // const wchar_t* raw_username = username.c_str();
另外注意:输出宽字符提示时,建议用std::wcout代替std::cout,避免出现编码乱码问题。
内容的提问来源于stack exchange,提问作者Kryton
相关产品推荐
相关产品推荐

