这是我在网站上的第一个问题,尽管我已经来这里参考了很长一段时间。我知道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 []数组上,则会正确显示字符串。
这是发生了吗?我究竟做错了什么?我明白,在特殊情况下,数组会衰减到指针吗?这是不是吗?
答案 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
。