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

时间:2011-11-10 15:05:52

标签: c c99

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

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

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

3 个答案:

答案 0 :(得分:5)

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

修改

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

或者只是使用fwrite

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

答案 1 :(得分:3)

你可以做一个宏

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

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

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

修改

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

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

答案 2 :(得分:1)

不能保证size_t是int,或者它可以在int中表示。它没有定义int的确切大小,而是担心size_t的实现可能需要用来解决大内存区域(超过大内存区域)的问题,这只是C的遗产的一部分。其中的MAX_INT值。)

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

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