C printf说明符%lld打印字符“ld”

u59ebvdq  于 2023-04-05  发布在  其他
关注(0)|答案(3)|浏览(368)

我正在使用gcc(-std= gnu 99)为一个嵌入式工具链(Myriota)进行开发,我在printf方面遇到了问题。
当我尝试以下代码时:

long long int time = TimeGet();
printf("\nSeconds since epoch: %lld\r\n", time);

它打印:

Seconds since epoch: ld

使用"%" PRId64打印相同的“ld”。
有什么好主意吗?如果你能告诉我正确的地方,我将不胜感激。

编辑变量类型修正long long int time

lyr7nygr

lyr7nygr1#

最有可能的是,您的C库,特别是它的printf实现不支持C99。
类型long long int%lld是由1999 ISO C标准(C99)引入的。使用gcc -std=c99使编译器尝试符合C99,但它不能使运行时库做它不实现的事情。编译器支持的内容和运行时库支持的内容不匹配。
在C90中,使用格式字符串中的%lld调用printf时,会出现未定义的行为。
%ld是否适用于long int类型的参数?如果参数不超过LONG_MAX,转换并使用%ld可能是一个很好的解决方案。如果您需要打印超过LONG_MAX的值,实现long long int到字符串的转换并不困难。

iqjalb3h

iqjalb3h2#

Myriota SDK使用newlib-nano,它不支持int64_t。我必须实现自己的函数来转换为char字符串,或者转换为uint32_t。

eqoofvh9

eqoofvh93#

#include <stdio.h>

void int64_to_string(int64_t num, char* str) {
    if (num < 0) {
        *str++ = '-';
        num = -num;
    }

    char buffer[20]; // Maximum 19 digits in int64_t
    int i = 0;
    do {
        buffer[i++] = num % 10 + '0';
        num /= 10;
    } while (num != 0);

    while (i > 0) {
        *str++ = buffer[--i];
    }
    *str = '\0';
}
int64_t num = 1234567890123456789;
char str[20]; // Maximum 19 digits in int64_t
int64_to_string(num, str);
printf("%s\n", str); // Output: "1234567890123456789"

相关问题