[英]Accepting extended ASCII codes as input in C++
考虑到世界上某些城市名称将其作为字符,我的程序不接受诸如“à”之类的符号。 我正在使用C ++。 我已经尝试过各种输入流,例如getline(cin,string),fgets等。 收集输入中的所有这些形式请参见“ ...”处的特殊符号。
这是Visual Studio 2015中制作的Windows控制台应用程序
例如
string funnyChar = "à";
getline(cin, checkFunny);
if (checkFunny.compare(funnyChar) == 0)
//do things
用户输入àero
ALT + 0224ero
或用户输入àeroas
ALT + 133ero
在代码中,输入流无法在if语句中看到按原样输入的替代代码
if(checkFunny.compare(funnyChar)==0)
将永远无法工作。
或多或少,我需要能够接受这些(任何)特殊字符,以便我可以保存它们,然后在以后显示它们,但是,也不接受非常特殊的字符,例如†(alt + 0134)
如果您试图在程序的参数列表中使用这些字符,那是不可能的。 main必须声明为main(void)','main(int argc,char ** argv)'或语义等效项。 我相信您会需要“ main(int argc,wchar_t ** argv)”之类的东西,但该标准不允许这样做。
如果您只是想在其他地方获取数据之后再处理数据,我会说尝试这些功能的宽字符版本。 例如fgetwc。 大概是这样的。
#include <iostream>
#include <string>
int main() {
std::locale loc("");
std::locale::global (loc);
wcin.imbue(loc);
std::wstring city;
std::wcout << L"Enter your city: ";
std::wcin >> city;
std::wcout << L"What's it like in " << city << "?\n";
}
C ++通常不会在源代码中编码扩展字符(通常是ASCII,UTF-7)。 尝试
string funnyChar = "\x85";
它应该按照您期望的方式开始工作。
将stdin
和stdout
模式设置为U16
可以解决问题。 检查以下代码。 (请注意,仅当您要再次输出相同字符时,才需要设置stdout
。)
#include <iostream>
#include <string>
#include <io.h>
#include <fcntl.h>
int main()
{
_setmode(_fileno(stdin), _O_U16TEXT);
_setmode(_fileno(stdout), _O_U16TEXT);
std::wstring funnyChar(L"à");
std::wstring checkFunny;
std::wcin >> checkFunny;
if (checkFunny.compare(funnyChar) == 0)
std::wcout << L"Yay" << std::endl;
std::wcout << checkFunny << std::endl;
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.