Visual C ++ argv问题

时间:2009-07-11 15:43:22

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

我在使用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做这个,然后我得到了整个字符串。

2 个答案:

答案 0 :(得分:19)

默认情况下,_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;
}

答案 1 :(得分:0)

所有示例都向您展示了如何将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
}