【发布时间】:2021-06-29 19:25:17
【问题描述】:
是否可以读取多行国际字符?我可以用简单的 ascii 字符串做到这一点:
#include <iostream>
#include <string>
void main ()
{
std::string text{};
//I cannot use std::wcin in that manner
//std::wcout << "Enter any arbitrary text terminated by an asterisk:" << std::endl;
//std::wstring wtext{};
//std::getline (std::wcin, wtext, '*');THIS SPECIFIC LINE DOESN'T COMPILE
std::cout << "Enter any arbitrary text terminated by an asterisk:" << std::endl;
std::getline (std::cin, text, '*');
}
如何使用支持国际字符的字符串类型来实现同样的效果?
根据要求,我包含了无法编译的行。 我的疑问是:还有其他方法吗?
错误是:没有重载函数“std::getline”的实例与参数列表匹配
已解决。请注意在接受的答案中存在L 前缀'*'。在我使用wcin 和wstring(会产生编译错误的那个)注释掉的std::getline 调用中,我忘记使用wchar_t 文字并改用char 文字。因此类型不匹配(string 由char、wstring 和wchar_t 组成——又名宽字符)。要表示一个宽字符文字,需要添加一个L 作为前缀,即L'*'。
【问题讨论】:
-
我不能以那种方式使用 std::wcin 为什么不呢?
-
另外,C++ 对 unicode 的支持很糟糕。如果你想使用 unicode,你应该得到一个专用的库,让你的生活更轻松。
-
std::getline是一个使用基本模板std::basic_string的模板。因此可以处理任何类型的字符,只要流和字符串都使用相同的字符类型。 -
也许问题是您仍然使用窄字符
'*'而不是宽字符L'*'?分隔符必须与流和字符串的字符类型相同。 -
Works just fine here。您是否偶然忘记在调用
getline时将'*'更改为L'*'?