1

这是我在该网站上的第一个问题,尽管我已经来这里参考已有一段时间了。我知道 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[] 数组上时正确显示字符串。

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

4

3 回答 3

5

我也明白std::cout将字符指针视为空终止字符串并将字符串打印出来。

大多是正确的。它适用于char*,但不适用于其他类型的字符。这正是问题所在。您有一个_TCHAR*,它char*在 ANSI 版本上但不在 Unicode 版本上,因此您不会获得特殊的字符串行为,而是获得默认的指针行为。

我了解,在特殊情况下,数组会衰减为指针?这是没有的情况吗?

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

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

于 2011-11-11T16:03:35.240 回答
2

用于wcoutUnicode 字符串。

于 2011-11-11T15:46:31.290 回答
0

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

改写

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

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

于 2011-11-11T15:53:35.920 回答