在用 Visual Studio 2008 编写的简单 C++ 应用程序中处理命令行参数时遇到问题。我编写了以下代码:
#include <iostream>
using namespace std;
int _tmain(int argc, char **argv)
{
char* c = *argv;
for(int i=0; i< argc ; ++i)
{
cout << argv[i] << endl;
}
int a;
cin >> a;
return 0;
}
我的问题是只有每个命令行参数的第一个字符被写入cout
。
我确定原因是命令行参数中的字符表示为 2 个字节,使得每隔 1 个字节 char
只包含零,即“\0”。
我的问题是,为什么会发生这种情况?从我在网上的示例中发现的内容来看,它应该像我写的那样工作。另外,有没有办法强制参数中的字符为 1 字节表示形式?
我希望我的问题足够清楚。
最佳答案
您的_tmain
正在接收UTF-16字符,当输入拉丁文本时,每隔一个字节就有一个0。您将它们解释为单字节字符。您需要将它们解释为宽字符。
我会这样写:
#include <iostream>
using namespace std;
int wmain(int argc, wchar_t* argv[])
{
for(int i=0; i<argc; ++i)
{
wcout << argv[i] << endl;
}
int a;
wcin >> a;
return 0;
}
如果您不想使用 UTF-16,那么您可以继续使用 char
,如下所示:
int main(int argc, char* argv[])
{
for(int i=0; i<argc; ++i)
{
cout << argv[i] << endl;
}
int a;
cin >> a;
return 0;
}
请注意 main
函数命名的变化。在 MS 世界中,wmain
接收 wchar_t*
,main
接收 char*
。
如果您确实切换到 char*
,那么您还应该更新您的项目配置以定位 MBCS 而不是 Unicode。
有关 MS 编译器主函数处理的更多信息,请参见:main: Program Startup .
关于c++ - Visual Studio 2008 中命令行参数的 2 字节表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609084/