【问题标题】:Main only receiving first letters of argumentsMain 只接收参数的第一个字母
【发布时间】:2010-07-09 18:05:04
【问题描述】:
int _tmain(int argc, char** argv)  
    {  
      FILE* file1=fopen(argv[1],"r");  
      FILE* file2=fopen(argv[2],"w");  
    }

似乎只收到了参数的第一个字母......我不明白为什么!

std::cout<<"Opening "<<strlen(argv[1])<<" and writing to "<<strlen(argv[2])<<std::endl;

无论如何输出 1 和 1。 (在 MSVC 2010 中)

【问题讨论】:

  • 什么是_tmain?你在什么环境下工作?
  • 查看这个问题的答案stackoverflow.com/questions/895827/…
  • 我不认为它是重复的。它的措辞不同,您不是我见过的第一个遇到这些症状的开发人员。所以这个公式至少应该保留恕我直言。

标签: c++ windows unicode


【解决方案1】:

当您使用UNICODE 集进行编译时,它不是char,而是wchar_t

编译为wmain。链接器只是没有注意到有不同的签名,因为它是“导出 C”函数,并且它的名称不包含其参数类型。

所以应该是 int _tmain(int argc, TCHAR** argv)

转换为 char 很棘手,而且并不总是正确的 - Win32 提供的函数只会正确转换当前的 ANSI 代码页。

如果您想在应用程序内部使用 UTF-8,那么您必须在其他地方寻找转换器(例如在 Boost

【讨论】:

【解决方案2】:

您的参数字符串以 UNICODE 的形式出现。

看到这个question

【讨论】:

    【解决方案3】:

    不要在 Windows 上使用 char 数据类型,它会破坏 Unicode 支持。请改用“宽”功能。在 C++ 中,避免使用 C 的 stdio,而是使用文件流:

    #include <cstdlib>
    #include <string>
    #include <fstream>
    int wmain(int argc, wchar_t** argv) {
      if (argc <= 2) return EXIT_FAILURE;
      const std::wstring arg1 = argv[1];
      const std::wstring arg2 = argv[2];
      std::ifstream file1(arg1.c_str());
      std::ofstream file2(arg2.c_str());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 2021-04-07
      • 2021-12-07
      相关资源
      最近更新 更多