在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?

Posted

技术标签:

【中文标题】在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?【英文标题】:Simplest way to write output message to 'output window' in Visual Studio 2010? 【发布时间】:2010-07-05 11:45:59 【问题描述】:

我已经尝试过OutputDebugString 函数,但大多数时候我都会收到如下错误:

错误 C2664:“OutputDebugStringA”:无法将参数 1 从“int”转换为“LPCSTR”

例子

尝试 1:

//ERROR: sprintf is unsafe. Use sprintf_s instead
int x = 4;
char s[256];
sprintf(s, "There is %d numbers", x);
OutputDebugString((LPCWSTR)s);

尝试 2:

//FAIL: outputs junk (sprintf_s doesn't understand unicode?)
int x = 4;
char s[256];
sprintf_s(s, "There is %d numbers", x);
OutputDebugString((LPCWSTR)s);

尝试 3:

//ERROR: no instance of overloaded function "sprintf_s" matches the argument list
int x = 4;
TCHAR s[256];
sprintf_s(s, "There is %d numbers", x);
OutputDebugString((LPCWSTR)s);

尝试 4:

//ERROR: no instance of overloaded function "sprintf_s" matches the argument list
int x = 4;
TCHAR s[256];
sprintf_s(s, L"There is %d numbers", x);
OutputDebugString((LPCWSTR)s);

尝试 5:

//ERROR: no instance of overloaded function "swprintf" matches the argument list
int x = 4;
TCHAR s[256];
swprintf(s, "There is %d numbers", x);
OutputDebugString(s);

尝试 6:

//ERROR: 'swprintf': function has been changed to confirm with the ISO C standard, adding an extra character count parameter
int x = 4;
TCHAR s[256];
swprintf(s, L"There is %d numbers", x);
OutputDebugString(s);

【问题讨论】:

【参考方案1】:

它只接受字符串作为参数,而不接受整数。尝试类似

sprintf(msgbuf, "My variable is %d\n", integerVariable);
OutputDebugString(msgbuf);

更多信息请查看http://www.unixwiz.net/techtips/outputdebugstring.html

【讨论】:

+ @Jon: 更好的是,考虑使用 std::stringstream。 @Billy ONeal:我使用 std::stringstream 而不是 sprintf/sprintf_s 正如你所建议的那样。谢谢。 @BillyONEal 你能解释一下为什么使用 stringstream 会更好吗?只是好奇。 @TrevorHart 2017 年法案与 2010 年法案并不完全一致。主要优点是无需担心目标缓冲区大小。但是 sprintf 有很多用途:) @BillyONeal 你会如何使用std::stringstream?语法是什么?【参考方案2】:

出于调试目的,您可以使用_RPT macros。

例如,

_RPT1( 0, "%d\n", my_int_value );

【讨论】:

【参考方案3】:

我知道的最常见的方式是TRACE 宏:

http://msdn.microsoft.com/en-us/library/4wyz8787%28VS.80%29.aspx

例如:

int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );

TRACE( "The value of x is %d\n", x );

TRACE( "x = %d and y = %d\n", x, y );

TRACE( "x = %d and y = %x and z = %f\n", x, y, z );

【讨论】:

好像TRACE是在MFC中定义的,我没用过。【参考方案4】:

我在搜索错误信息时找到了这个答案:https://***.com/a/29800589

基本上,使用OutputDebugString 时,您只需在输出字符串前面加上一个“L”:

OutputDebugString(L"test\n");

它对我很有用。

编辑:

为了用数据格式化字符串,我最终使用了

char buffer[100];
sprintf_s(buffer, "check it out: %s\n", "I can inject things");
OutputDebugStringA(buffer);

我绝不是专家,我只是发现了一些可行的方法并继续前进。

【讨论】:

如果我想格式化字符串并将数据传递给它,这并没有考虑到。 我添加了适用于注射的解决方案。我专攻ios平台和语言,请不要将此视为专家解决方案:) 根据您的编译器选项和设置,OutputDebugString 被转换为两个目标之一,OutputDebugStringW 用于宽文本字符 (wchart_t) 或 OutputDebugStringA 用于窄文本字符 (char )。 L 是创建wchar_t 宽字符串所必需的,如L"wide char""narrow char"sprintf_s() 函数使用窄字符,标准char 类型,因此char buffer[100]; 内容使用OutputDebugStringA() 打印到输出窗口以强制使用窄字符文本。【参考方案5】:

用途:

OutputDebugStringA("Some random text");

或者:

OutputDebugString("Some random text");

【讨论】:

【参考方案6】:

要使用 OutputDebugString(),请提供 char *const char * 作为参数:

OutputDebugString("This is an output");

【讨论】:

以上是关于在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2010 中将数据保存到本地数据库?

MS Visual Studio 2010 如何使用 .asm 生成的文件

在 Visual Studio 2010 负载测试用户包中将用户数升级到 250 或更多

如何在 Visual Studio 2010 Express 中将 cpp 编译为 dll

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器

如何从 Visual Studio 调试输出窗口中读取文本