繁体   English   中英

使用size_t指定C的printf中字符串的精度

[英]Using size_t for specifying the precision of a string in C's printf

我有一个结构来表示内存中的字符串,如下所示:

typedef struct {
    size_t l;
    char   *s;
} str_t;

我相信使用size_t对于指定char字符串的长度是有意义的。 我还想用printf("%.*s\\n", str.l, str.s)打印这个字符串。 但是, * precision需要一个int参数,而不是size_t 我一直无法找到与此有关的任何内容。 有没有正确使用这种结构,没有在printf()调用中转换为int

printf("%.*s\n", (int)str.l, str.s)
//               ^^^^^ use a type cast

编辑

好的,我没有正确地阅读这个问题。 你不想使用类型转换,但我想,在这种情况下:艰难。

或者只是使用fwrite

fwrite(str.s, str.l, 1, stdout);
printf("\n");

你可以做一个宏

#define STR2(STR) (int const){ (STR).l }, (char const*const){ (STR).s }

然后将其用作printf("%.*s\\n", STR2(str))

请注意,这会对STR两次评估,因此请注意副作用,但您可能已经知道了。

编辑:

我正在使用复合初始值设定项,这些是隐式转换。 如果出现问题,编译器会向您发出警告的可能性大于使用显式强制转换的情况。

例如,如果STR有一个字段.l是一个指针而你只是将一个强制转换为int ,那么所有编译器都会很乐意将该指针转换为int 类似于.s字段,这实际上必须对应于char*或兼容的东西,否则你会看到警告或错误。

不能保证size_t是int,或者它可以在int中表示。 这只是C未能定义int的确切大小的遗留问题的一部分,再加上可能需要利用size_t的实现来解决大内存区域(其中包含超过MAX_INT值的内存区域)的问题。

关于size_t的最常见错误是假设它等同于unsigned int。 这些旧的bug很常见,从个人经验来看,它使得从32位架构移植到64位架构变得很麻烦,因为你需要撤消这个假设。

充其量,你可以使用演员表。 如果你真的想要摆脱演员表,你可以放弃使用size_t。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM