2011-09-30 69 views
2

在用Visual Studio中的一个简单的C++应用程序2008年我写了下面的代码处理命令行参数时,我有一个问题:2字节表示2008年

#include <iostream> 

using namespace std; 

int _tmain(int argc, char **argv) 
{ 
    char* c = *argv;  

    for(int i=0; i< argc ; ++i) 
    { 
     cout << argv[i] << endl; 
    } 

    int a; 
    cin >> a; 

    return 0;  
} 

我的问题只有每个命令行参数的第一个字符被写入cout

我确定原因是命令行参数中的字符表示为2个字节,因此每个其他1个字节只包含0,即'\ 0'。

我的问题是,为什么会发生这种情况?从我在网上的样品中发现它应该如我写的那样工作。另外,有没有办法强制参数中的字符是1字节表示?

我希望我的问题很清楚。

+2

'_tmain'的签名是'int _tmain(int argc,TCHAR ** argv)' –

回答

5

您的_tmain正在接收UTF-16字符,当输入拉丁文字符时,每隔一个字节就有一个字符为0。您正在将它们解释为单字节字符。你需要将它们解释为宽字符。

我会写它是这样的:

#include <iostream> 

using namespace std; 

int wmain(int argc, wchar_t* argv[]) 
{ 
    for(int i=0; i<argc; ++i) 
    { 
    wcout << argv[i] << endl; 
    } 

    int a; 
    wcin >> a; 

    return 0; 
} 

如果你不想使用UTF-16,那么你可以用char这样的坚持:

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

    int a; 
    cin >> a; 

    return 0; 
} 

注意的变化main函数的命名。在MS世界中,wmain收到wchar_t*main收到char*

如果您确实切换到char*,那么您还应该更新您的项目配置,以将目标设定为MBCS而不是Unicode。

关于MS编译器主要功能处理的更多信息可以在这里找到:main: Program Startup

+0

谢谢您的快速回答。如果我这样做,使用向导,然后将VS2008项目发送给另一个人。他的行为与我在运行程序时是否一样? – PKeno

+0

是的,它会是一样的。事实上,我已经改变了关于巫师的想法。它使用TCHAR,这是混淆不再需要的。看到我的更新(以及我将尽快做的)。 –

+0

谢谢。改成'main'解决了这个问题。 – PKeno