3

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

4

2 回答 2

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 字符串,请像这样使用普通main的 withcharcout

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

    return 0;
}

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

失败的地方是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;
}
于 2009-07-11T15:58:26.557 回答
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
}
于 2012-06-28T12:38:42.660 回答