Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Sprintf关于格式化的警告_C_Printf_C99 - Fatal编程技术网

C Sprintf关于格式化的警告

C Sprintf关于格式化的警告,c,printf,c99,C,Printf,C99,我对c语言中的sprintf格式有一个问题。无论我以何种方式格式化数据,编译器都会发现另一个问题。首先,请考虑以下代码: #include <stdio.h> #include <stdint.h> int main(void) { char text[100]; uint8_t hours = 1, minutes = 10, seconds = 20; int32_t milisec = 300; sprintf(text, "[

我对c语言中的sprintf格式有一个问题。无论我以何种方式格式化数据,编译器都会发现另一个问题。首先,请考虑以下代码:

#include <stdio.h>
#include <stdint.h>

int main(void) 
{
    char text[100];
    uint8_t hours = 1, minutes = 10, seconds = 20;
    int32_t milisec = 300;

    sprintf(text, "[%02u:%02u:%02u.%03i]", hours, minutes, seconds, milisec);
    printf("%s", text);

    return 0;
}
如果我将%u更改为%lu,我会得到:

标头提供了PRIu8和PRIi32等宏,它们是uint8和int32等标准整数类型的格式字符串片段。优点是这些宏是可移植的,并且包含正确的格式说明符,即使使用不同的基本类型来实现这些整数类型。

您需要为这些类型使用正确的格式说明符。比如说

#include <inttypes.h>

uint32_t hours = 1, minutes = 10, seconds = 20;
int32_t milisec = 300;

sprintf(text, "[%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ".%03" PRId32 "]",
        hours, minutes, seconds, milisec);
在上面的片段中,PRIu32用于以十进制打印uint32,PRId32用于打印int32


另一种选择是对所有这些值使用int/unsigned,并希望32767/65535小时对每个人都足够。

可能使用您警告的编译器类型?应该会有帮助。顺便说一句,您收到的警告与您显示的代码不匹配。请修复代码,使其与警告匹配!我认为您也应该将PRIu8用于分钟和秒,以匹配海报示例中声明的类型。
warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'int' [-Wformat=]
#include <inttypes.h>

uint32_t hours = 1, minutes = 10, seconds = 20;
int32_t milisec = 300;

sprintf(text, "[%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ".%03" PRId32 "]",
        hours, minutes, seconds, milisec);