2011-11-11 107 views
1

这是我在网站上的第一个问题,尽管我一直在这里参考相当一段时间。我知道argv [0]存储程序的名称,其余的命令行参数存储在其余的argv [k]槽中。我也明白,std :: cout把一个字符指针看作是一个以null结尾的字符串,并将字符串打印出来。以下是我的计划。无法在VC++中使用std :: cout打印出argv []值

#include "stdafx.h" 
#include <fstream> 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    cout << argv[0] << " "; 
    cout << argv[1] ; 

    return 0; 
} 

根据我在互联网搜索中看到的所有其他程序,这个程序应该打印出两个字符串即viz。程序名称和命令行参数。控制台窗口显示

0010418c 001048d6

相信这些都是ARGV [0]和argv [1] RESP的指针。 我唯一的命令行参数是“nanddumpgood.bin”,它在argv [1]中进行,如果在调试时将鼠标悬停在argv []数组上,则会正确显示字符串。

这是怎么回事?我究竟做错了什么?我明白,在特殊情况下数组会衰减到指针?这是它没有的情况吗?

回答

5

我也明白std::cout把一个字符指针看作是一个以空字符结尾的字符串,并将字符串打印出来。

这就是主要是正确。它适用于char*,但不适用于其他类型的角色。这正是问题所在。你有一个_TCHAR*,它是ANSI构建的IS char*而不是Unicode构建的,所以不用获取特殊的字符串行为,而是获得默认的指针行为。

我明白,在特殊情况下数组会衰减到指针吗?这是它没有的情况吗?

argv是一个数组,但既不argv[0]也不argv[1]是数组,它们是两个指针。衰退在这里不是一个因素。

最简单的修复方法是使用int main(int argc, char* argv[]),以便获取命令行参数的非Unicode字符串。我建议这样做,而不是切换到wcout,因为它与您在互联网上找到的其他代码更兼容。

2

对于Unicode字符串使用wcout

+0

工作。谢谢。 :) –

+0

如果他使用'wcout',他不妨改变'wchar_t'的参数 –

0

我想你正在用unicode编译器开关编译你的应用程序,它将所有的TCHAR作为wchar_t对待。因此cout将argv视为int。

写,而不是

wcout << argv[0] << L" "; 
wcout << argv[1] ; 

或更改Use Multi-byte character组在项目设置/一般。

+0

不,它不会将'argv'视为int。它是一个指针,但不是'char *'。 –

+0

我正在使用Visual Studio 2010.我想我忘了提及。感谢Ben的澄清。 –