处理格式说明符 %llu 时的警告

warnings when dealing with format specifier %llu

提问人:Kryspin 提问时间:3/1/2023 最后编辑:JabberwockyKryspin 更新时间:3/1/2023 访问量:134

问:

这里只是一个新程序员。

我正在试验 和 ,特别是使用它们来查找数组的大小,因为我试图使具有索引数的数组是可更改的。size_tsizeof

法典:

int main() {

    int index = 0;

    printf("Enter size of an array: ");
    scanf("%d", &index);

    int MyArray[index];

    size_t capacity = sizeof(MyArray)/sizeof(MyArray[0]);

    printf("\nThe length of your array is: %llu", capacity);

    return 0;
}

如果你看一下这个语句,你可以看到我使用了一个格式说明符,因为(如果我是对的)它是 .printf%llulong long unsigned intsize_t

但随后它给了我多个警告,例如:

warning: unknown conversion type character 'l' in format [-Wformat=]|
warning: too many arguments for format [-Wformat-extra-args]|
C 编译器警告 sizeof 格式说明符 size-t

评论

2赞 Weather Vane 3/1/2023
请使用正确的格式说明符,尽管是有效的格式规范。题外话:目前还不清楚为什么需要计算刚刚定义为具有元素的数组的长度。%zu%lluindex
0赞 Weather Vane 3/1/2023
您是否复制/粘贴了导致错误的确切代码?l

答:

2赞 Eric Postpischil 3/1/2023 #1

如果你看一下这个语句,你可以看到我使用了一个格式说明符,因为(如果我是对的)它是 .printf%llulong long unsigned intsize_t

显然这是不对的。某些 C 实现可能使用 for ,但您的实现则不然。long long unsigned intsize_t

C 标准为类型指定格式标志,因此是在任何 C 实现中使用的正确转换说明符。printfsize_tz%zusize_t

1赞 Vlad from Moscow 3/1/2023 #2

至于获得的警告,则此转换说明符按原样正确编写。也许这些警告是其他一些消息的结果,即使用了具有该类型值的不正确的转换说明符。%llusize_t

此外,一些非常旧的编译器不支持类型和 .因此,没有引入转换说明符。long long intunsigned long long intllu

但是,在任何情况下,您使用的都是无效的转换说明符,其值为 。size_t

摘自 C 标准(7.19 通用定义 <stddef.h>)

4 用于size_t和ptrdiff_t的类型不应包含整数 转换等级大于有符号长整数的转换等级,除非 实现支持足够大的对象,因此需要这样做。

通常,该类型被定义为该类型的别名。类型的秩大于类型的秩(即与类型的秩相同)。size_tunsigned long intunsigned long long intunsigned long intsigned long int

例如,在 Microsoft C 中,等于 while 和 等于 。而且,该类型被定义为该类型的别名,而不是通常使用的类型。sizeof( unsigned long long int )8sizeof( unsigned long int )sizeof( size_t )4size_tunsigned intunsigned long

并来自 C 标准(7.21.6.1 fprintf 函数)

7 长度修饰符及其含义是:

z 指定后面的 d、i、o、u、x 或 X 转换说明符适用于size_t或相应的有符号整数 类型参数;或者以下 n 个转换说明符适用于 指向与size_t参数对应的有符号整数类型的指针。

因此,要输出该类型的对象,您应该使用 转换说明符 。size_tzu

9 如果转换规范无效,则行为为 未定义。如果任何参数不是 相应的转换规范,行为未定义。

因此,你应该写

printf("\nThe length of your array is: %zu", capacity);
                                       ^^^^ 

评论

0赞 Weather Vane 3/1/2023
这如何回答有关未知格式说明符的问题?
0赞 Weather Vane 3/1/2023
谢谢,我想知道 OP 是否从实际代码中错误地复制了它,它可能是错别字。这已经不是第一次将一本书中的代码与 where an should be 错误复制了。%l1u1l
0赞 Kryspin 3/5/2023
不幸的是,我确实尝试了“%zu”,现在它说 z 是一种未知的转换类型。
0赞 Vlad from Moscow 3/5/2023
@Kryspin 看来您正在使用一个非常旧的编译器。在本例中,请使用转换说明符 %lu。