c++ - Visual Studio 2008 中命令行参数的 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;    
}

我的问题是只有每个命令行参数的第一个字符被写入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/

相关文章:

c++ - clang-modernize 可以更新 Windows/MFC 代码库吗?

c++ - 字符串有问题。调试声称 "bad pointer"

c# - 如何获取已打开连接的套接字 ID/句柄/描述符? (.NET,C++,德尔福)

c++ - 将任何函数作为模板参数传递?

c++ - Boost 堆元素句柄比较和 MSVC 迭代器调试工具

c++ - 按一列对二维数组进行冒泡排序

c++ - Qt C++ 每秒运行一次代码

c++ - 使用与 MinGW 交叉编译的 libx264 时发生奇怪且不可预测的崩溃

c++ - 微软 C/C++ : what is the definition of "strict conformance" w. r.t.执行?

在我的 C 程序中无法理解 "warning C4090: ' =': different ' const' qualifiers