无法在C ++中使用std :: cout打印出argv []值

时间:2011-11-11 15:42:21

标签: visual-c++ cout argv

这是我在网站上的第一个问题,尽管我已经来这里参考了很长一段时间。我知道argv [0]存储程序的名称,其余的命令行争论存储在剩余的argv [k]槽中。我也明白std :: cout将字符指针视为空终止字符串并将字符串输出。以下是我的计划。

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

using namespace std;

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

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

    return 0;
}

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

0010418c 001048d6

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

这是发生了吗?我究竟做错了什么?我明白,在特殊情况下,数组会衰减到指针吗?这是不是吗?

3 个答案:

答案 0 :(得分:5)

  

我也理解std::cout将字符指针视为空终止字符串并将字符串输出。

那个主要是正确的。它适用于char*,但不适用于其他类型的字符。这正是问题所在。你有一个_TCHAR*,它在ANSI版本上是char*但在Unicode版本上没有,所以你得到了默认的指针行为,而不是获得特殊的字符串行为。

  

据我所知,在特殊情况下,数组会衰减到指针?这是不是吗?

argv是一个数组,但argv[0]argv[1]都不是数组,它们都是指针。腐烂不是这里的一个因素。

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

答案 1 :(得分:2)

对Unicode字符串使用wcout

答案 2 :(得分:0)

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

改为写

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

或更改为项目设置/常规中设置的Use Multi-byte character