我在使用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做这个,然后我得到了整个字符串。
答案 0 :(得分:19)
默认情况下,_tmain
将Unicode字符串作为参数,但cout
需要ANSI字符串。这就是为什么它只打印每个字符串的第一个字符。
如果您想使用Unicode _tmain
,则必须将其与TCHAR
和wcout
一起使用,如下所示:
int _tmain(int argc, TCHAR* argv[])
{
for (int c = 0; c < argc; c++)
{
wcout << argv[c] << " ";
}
return 0;
}
或者,如果您乐意使用ANSI字符串,请使用正常main
与char
和cout
,如下所示:
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
}