Visual Studio 2008中的命令行参数的2字节表示形式

PKe*_*eno 2 c++ visual-c++

在使用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;    
}
Run Code Online (Sandbox Code Playgroud)

我的问题是只写入每个命令行参数的第一个字符cout.

我确定原因是命令行参数中的字符表示为2个字节,使得每隔一个字节char只包含0个字,即'\ 0'.

我的问题是,为什么会这样?从我在网上的样本中找到它应该工作,因为我写了它.另外,有没有办法强制参数中的字符为1字节表示?

我希望我的问题很清楚.

Dav*_*nan 5

_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;
}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用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;
}
Run Code Online (Sandbox Code Playgroud)

请注意main函数命名的更改.在MS世界中,wmain接收wchar_t*main接收char*.

如果切换到char*那时,您还应该将项目配置更新为目标MBCS而不是Unicode.

有关MS编译器主要功能处理的更多信息,请参见:main:程序启动.