【问题标题】:Why printf runs into error with n format specifier?为什么 printf 遇到带有 n 格式说明符的错误?
【发布时间】:2020-07-30 05:02:49
【问题描述】:

我有一些带有%n printf 的 C 代码:

#include <stdio.h>
int main(){
    int i, j;
    i = printf( "something%n", &j );
    return i + j; 
}

编译和执行没有错误。 printf 打印字符串“something”。

为什么我的 printf 返回 -1 以及为什么它不将 n 参数保存在 j 中?

这是调试时的照片..

【问题讨论】:

  • 我认为您的意思是使用 scanf 而不是 printf。请仔细查看。
  • 不,printf 用 %n

标签: c printf format-specifiers


【解决方案1】:

我编译你的代码并验证,你可以在这里查看:https://onlinegdb.com/BJIF5EUOI

结果:

根据文档(http://www.cplusplus.com/reference/cstdio/printf/)看来它工作正常

printf 返回写入的字符总数,结果存储在i 变量中

%n 存储了迄今为止在j 下写入的字符数

main() 返回 i + j - 所以写入的字符总数是 2 倍

【讨论】:

  • 谢谢,但这是我的调试i.stack.imgur.com/jJTcS.png
  • 这对我的项目来说不是必需的,但我不知道为什么 printf 有这种行为......
  • 在线调试器 (onlinegdb.com/online_c++_debugger) 也能正常工作:imgur.com/a/4ZYoVH1
  • 对我来说,这两件事可能发生在你身边:1)你破坏了 C 调试器/编译器或一般环境配置错误 2)导致 printf 失败(这就是它返回 -1 和 "%n " 不工作尝试检查“错误指示器”(ferror):cplusplus.com/reference/cstdio/printf(检查“返回值”文档)
  • 上传的图片中连j值都是错误的。我建议您使用普通的旧 gdb 再次重新编译它进行调试。您正在监控的查看器有问题
【解决方案2】:

如果您使用 Microsoft C 编译器并在 Windows 上运行程序,那么默认情况下,将 %n 与 printf 一起使用确实会失败。这是因为 Microsoft 将 %n 视为安全风险,并在 printf 和相关打印格式化功能中默认禁用它。

要启用 %n,请在程序的早期添加以下行:

_set_printf_count_output(1);

以下帮助文章中有关 %n 的重要说明中记录了这一点:

格式规范语法:printf 和 wprintf 函数 https://docs.microsoft.com/en-us/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions

【讨论】:

  • 是的,谢谢,你是对的,我已经在一些类似的主题中看到了这个答案,但我的编译器(GNU GCC Compiler Codeblocks)拒绝了这一行。也许它适用于 Visual c++ 编译器......我不知道。无论如何,现在我知道问题是什么了。再次感谢。
猜你喜欢
  • 2013-06-22
  • 2013-06-22
  • 1970-01-01
  • 2012-10-01
  • 2018-11-22
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多