c语言 - 不能让 printf 开心。拒绝"i"和"l"的格式字符串


long int triagedOut = 0;
printf("%i", triagedOut);

main.c|89|警告:格式'%i'期望参数类型为'int',但是参数2的类型为'long int' [-Wformat=]|

对于同一行,我实际上得到了该消息两次。???

好的,所以我将它改为长整型指定符"l"然后…

printf("%l", triagedOut);

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

main.c|89|警告:format参数太多[-Wformat-extra-args] |

这两条信息我也收到了两次。

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

您需要使用%ld代替long int

printf("%ld", triagedOut);

  • 格式%i确实期望一个int参数,你正在传递一个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可能编译两个不同版本的可执行文件,一个在调试模式,一个在生产模式。

我认为你应该使用%ld或%li而不是%l或% I来打印长整数。

long int triagedOut = 0;
printf("%li", triagedOut);

最新更新