警告:格式'%lu'需要'long unsigned int'类型的参数,但参数4的类型为'long unsigned int *'[ - Wformat]

时间:2013-06-08 21:04:39

标签: c arrays linux pointers printf

我得到warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'long unsigned int *' [-Wformat]以下代码

unsigned long  buf[254];
char systemlogmsg[500]= {'\0'};
snprintf(systemlogmsg, sizeof(systemlogmsg), "INFO: %lu ",  buf);

我应该使用什么代替%lu

此外,我尝试使用

snprintf(systemlogmsg, sizeof(systemlogmsg), "INFO: %lu ", (unsigned long int *) buf);

但它没有帮助。我应该如何通过演员?

3 个答案:

答案 0 :(得分:2)

我认为这里的问题是bufunsigned long数组,但是您传入的格式说明符需要单< / em> unsigned long。您应该从要打印的数组中选择特定的unsigned long,或者更改格式说明符以打印指针而不是unsigned long

希望这有帮助!

答案 1 :(得分:2)

buf是一个由254 unsigned long组成的数组,并在传递给函数时衰减为unsigned long *。您必须决定要打印的数组元素并使用数组下标:

snprintf(systemlogmsg, sizeof(systemlogmsg), "INFO: %lu ",  buf[0]);

例如。

编辑:如果要打印出所有254个数字,那么你需要在循环中调用该函数(显然,数组索引是循环变量)。

答案 2 :(得分:2)

unsigned long  buf[254];

声明一个unsigned long数组。因此,就sprintf而言,buf是一个指针。但是你试图格式化%lu,它不需要指针,也许是数组的一个元素:

snprintf(systemlogmsg, sizeof(systemlogmsg), "INFO: %lu ",  buf[0]);  // ok

因此,如果你有254个无符号长,你需要决定打印哪一个。如果你想全部打印出来:

int s = 0, i;
for (i=0; i< 254; i++)
  s+=snprintf(systemlogmsg+s, 
       sizeof(systemlogmsg)-s, "INFO: %lu ",  buf[i]);  // ok