首页 > 解决方案 > 不能让 printf 高兴。拒绝“i”和“l”的格式字符串

问题描述

long int triagedOut = 0;

printf("%i", triagedOut);

main.c|89|警告:格式“%i”需要“int”类型的参数,但参数 2 的类型为“long int”[-Wformat=]|

实际上,我在同一行中两次收到该消息。???

好的,所以我将其更改为 long int 说明符“l”,然后...

printf("%l", triagedOut);

main.c|89|警告:转换在格式末尾缺少类型 [-Wformat=]|

main.c|89|警告:格式参数过多 [-Wformat-extra-args]|

我也两次收到这两条消息。

我什至不知道怎么会有太多的东西。只是所有的1。它想告诉我什么?

标签: cprintf

解决方案


您需要%ld使用long int.

printf("%ld", triagedOut);

另请注意以下备注:

  • Format%i确实需要一个int参数,并且您传递的是 a long int,它是一种不同的类型,并且可能具有不同的大小,具体取决于目标平台。

  • 格式%l不完整:l只是一个长度修饰符,您还需要一个转换说明符,例如i, d, u, x... 因此建议更正%ldid等价于printf(),但它们具有不同的含义scanf()%i转换由其初始字符确定的以十进制、八进制或十六进制表示的整数,而%d仅转换以十进制表示的整数。

     int i;
     sscanf("0x10", "%i", &i);  // sets i to 16
     sscanf("0x10", "%d", &i);  // sets i to 0
     sscanf("010", "%d", &i);   // sets i to 10
     sscanf("010", "%i", &i);   // sets i to 8
    
  • 您收到两次消息的原因可能是这些是警告消息,不会阻止编译继续进行,并且您的 IDE 可能会编译 2 个不同版本的可执行文件,一个处于调试模式,一个处于生产模式。


推荐阅读