c++ - 在 win32 控制台应用程序中打印参数

标签 c++ visual-c++

这是我的代码:

int _tmain(int argc, _TCHAR* argv[])
{   
    for (int i = 1;i<argc;i++) printf("Argument %d:%s\n",i,argv[i]);
    // output = Argument 1:param

    for (int k = 1; k < argc; k++) cout << "Argument " << k << ": " << argv[k];
    // output =  Argument 1: 00BF5878
    return(0);
}

我的问题是:为什么我在 cout 和 printf 上看到不同的输出?

最佳答案

您在 cout 的输出中看到一个地址,因为您构建的程序定义了 UNICODE_UNICODE。可能是通过 Visual Studio 项目中的设置。然后_tmain展开为微软的非标准wmain_TCHAR展开为wchar_t

并且 cout 不知道指向 wchar_t 的指针如何指向一个以 null 结尾的宽字符字符串。

我不确定为什么 printf 没有发生这种情况。让我检查一下。


好的,我已经检查过,您的 printf 没有像您指示的那样打印“param”。

这是我检查过的更正代码:

#include <iostream>
#include <stdio.h>
#include <tchar.h>
using namespace std;

int _tmain( int argc, _TCHAR* argv[] )
{
    for( int i = 0;i < argc; ++i )
    {
        printf("printf Argument %d:%s\n",i,argv[i]);
    }

    for( int i = 0;  i < argc;  ++i )
    {
        cout << "cout Argument " << i << ": " << argv[i] << endl;
    }
}

结果如下:

[D:\dev\test]
> cl foo.cpp /D _UNICODE
foo.cpp

[D:\dev\test]
> foo param
printf Argument 0:f
printf Argument 1:p
cout Argument 0: 004F9A9C
cout Argument 1: 004F9AA4

[D:\dev\test]
> _

换句话说,这个明显的难题完全是由于您报告的结果不准确造成的。


解决方案:不使用 Microsoft 的非标准 wmain,特别是不使用现在完全没有意义的 Windows 9x 支持宏!,使用 标准 C++ main

关于c++ - 在 win32 控制台应用程序中打印参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739077/

相关文章:

c++ - 测试 isbn 编号以查看其是否有效

c++ - 如何计算 CMFCRibbonStatusBarPane 的大小

c++ - 使用 setw 和 iomanip 的 left

c++ - fwrite 阻塞在 "<?xml version"

c++ - 二叉搜索树未处理的异常

c++ - 如何将预建库添加到 VC++ 解决方案中?

c++ - 静态常量数组在 MSVC 中动态初始化?

c++ - 用预处理器 #define 替换作用域标识符

c++ - Gtkmm : How to update UI from another thread? 连续

c++ - std::bind(x, y) 到底是做什么的?