提问人:Kryspin 提问时间:3/1/2023 最后编辑:JabberwockyKryspin 更新时间:3/1/2023 访问量:134
处理格式说明符 %llu 时的警告
warnings when dealing with format specifier %llu
问:
这里只是一个新程序员。
我正在试验 和 ,特别是使用它们来查找数组的大小,因为我试图使具有索引数的数组是可更改的。size_t
sizeof
法典:
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
%llu
long long unsigned int
size_t
但随后它给了我多个警告,例如:
warning: unknown conversion type character 'l' in format [-Wformat=]|
warning: too many arguments for format [-Wformat-extra-args]|
答:
如果你看一下这个语句,你可以看到我使用了一个格式说明符,因为(如果我是对的)它是 .
printf
%llu
long long unsigned int
size_t
显然这是不对的。某些 C 实现可能使用 for ,但您的实现则不然。long long unsigned int
size_t
C 标准为类型指定格式标志,因此是在任何 C 实现中使用的正确转换说明符。printf
size_t
z
%zu
size_t
至于获得的警告,则此转换说明符按原样正确编写。也许这些警告是其他一些消息的结果,即使用了具有该类型值的不正确的转换说明符。%llu
size_t
此外,一些非常旧的编译器不支持类型和 .因此,没有引入转换说明符。long long int
unsigned long long int
llu
但是,在任何情况下,您使用的都是无效的转换说明符,其值为 。size_t
摘自 C 标准(7.19 通用定义 <stddef.h>)
4 用于size_t和ptrdiff_t的类型不应包含整数 转换等级大于有符号长整数的转换等级,除非 实现支持足够大的对象,因此需要这样做。
通常,该类型被定义为该类型的别名。类型的秩大于类型的秩(即与类型的秩相同)。size_t
unsigned long int
unsigned long long int
unsigned long int
signed long int
例如,在 Microsoft C 中,等于 while 和 等于 。而且,该类型被定义为该类型的别名,而不是通常使用的类型。sizeof( unsigned long long int )
8
sizeof( unsigned long int )
sizeof( size_t )
4
size_t
unsigned int
unsigned long
并来自 C 标准(7.21.6.1 fprintf 函数)
7 长度修饰符及其含义是:
z 指定后面的 d、i、o、u、x 或 X 转换说明符适用于size_t或相应的有符号整数 类型参数;或者以下 n 个转换说明符适用于 指向与size_t参数对应的有符号整数类型的指针。
因此,要输出该类型的对象,您应该使用 转换说明符 。size_t
zu
和
9 如果转换规范无效,则行为为 未定义。如果任何参数不是 相应的转换规范,行为未定义。
因此,你应该写
printf("\nThe length of your array is: %zu", capacity);
^^^^
评论
%l1u
1
l
评论
%zu
%llu
index
l