【问题标题】:Visual C++ argv questionVisual C++ argv 问题
【发布时间】:2012-06-28 20:38:42
【问题描述】:

我在使用 Visual Studio 2008 时遇到了一些问题。非常简单的程序:打印作为参数发送的字符串。

为什么会这样:

#include <iostream>

using namespace std;

int _tmain(int argc, char* argv[])
{
    for (int c = 0; c < argc; c++)
    {
        cout << argv[c] << " ";
    }
}

对于这些论点:

program.exe testing one two three

输出:

p t o t t

?

我尝试用 gcc 代替,然后我得到了整个字符串。

【问题讨论】:

  • 另请注意,argv[0] 是程序名称,因此不是参数之一。悬而未决的观点,但可能有益于此网页上发生的未来文明。

标签: c++ visual-c++ unicode argv


【解决方案1】:

默认情况下,_tmain 将 Unicode 字符串作为参数,但 cout 需要 ANSI 字符串。这就是为什么它只打印每个字符串的第一个字符。

如果你想使用 Unicode _tmain,你必须像这样使用 TCHARwcout

int _tmain(int argc, TCHAR* argv[])
{
    for (int c = 0; c < argc; c++)
    {
       wcout << argv[c] << " ";
    }

    return 0;
}

或者,如果您乐于使用 ANSI 字符串,请使用普通的 maincharcout,如下所示:

int main(int argc, char* argv[])
{
    for (int c = 0; c < argc; c++)
    {
       cout << argv[c] << " ";
    }

    return 0;
}

更详细一点:TCHAR_tmain 可以是 Unicode ANSI,具体取决于编译器设置。如果定义了 UNICODE(这是新项目的默认设置),它们会使用 Unicode。它没有定义UNICODE,他们说ANSI。所以理论上你可以编写不需要在 Unicode 和 ANSI 构建之间更改的代码 - 你可以在编译时选择你想要的。

使用 cout (ANSI) 和 wcout (Unicode) 会失败。没有_tcout 或同等的。但是您可以轻松地创建自己的并使用它:

#if defined(UNICODE)
    #define _tcout wcout
#else
    #define _tcout cout
#endif

int _tmain(int argc, TCHAR* argv[])
{
    for (int c = 0; c < argc; c++)
    {
       _tcout << argv[c] << " ";
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    所有示例都向您展示了如何将 argv 元素打印到标准输出。我需要转换为字符串的代码,我使用了这个:

    string localeCode="en-us";
    if(argc>1)
    {
        #define LOCALELEN 50
        char localeArg[LOCALELEN+1];
        size_t result=-1;
        wcstombs_s(&result, localeArg, LOCALELEN, argv[1], LOCALELEN);
        if(result)
        {
           localeCode.assign(localeArg);
        }
        #undef LOCALELEN
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多