【问题标题】:Can not print out the argv[] values using std::cout in VC++无法在 VC++ 中使用 std::cout 打印出 argv[] 值
【发布时间】:2011-11-12 00:35:52
【问题描述】:

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

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

【问题讨论】:

    标签: visual-c++ cout argv


    【解决方案1】:

    我也了解std::cout 将字符指针视为以空字符结尾的字符串并将字符串打印出来。

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

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

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

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

    【讨论】:

      【解决方案2】:

      对 Unicode 字符串使用 wcout

      【讨论】:

      • 如果他用的是wcout,不如把参数改成wchar_t
      【解决方案3】:

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

      改写

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

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

      【讨论】:

      • 不,它不会将 argv 视为 int。这是一个指针,但不是char*
      • 我使用的是 Visual Studio 2010。我想我忘了提及。感谢 Ben 的澄清。
      猜你喜欢
      • 2013-01-29
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多