sprintf的使用方法和%.s相关。

5

在使用sprintf时,像这样

sprintf("%.40s",str);

我想在40的位置上输入像strlen(str)这样的值。怎么做呢?我尝试用strlen(str)替换40,但不起作用。请告诉我如何输入此类值。

#define len strlen(str)

并且使用 %.len 也不起作用,因为 %.len 在 " " 中被使用。

1
如果strlen对您起作用,那么您就有一个以NULL结尾的字符串,您不需要为%s放置一个数字而烦恼。如果您的字符串没有以null结尾,那么无论如何您都会得到错误的长度。因此,它不能解决问题。 - CCoder
3个回答

9
使用*字符。
sprintf(/* ... */, "%.*s", (int) strlen(str), str);

如果您使用C99,snprintf也是适合的。

man printf (3)
宽度未在格式字符串中指定,而是作为要格式化的参数之前的附加整数值参数。


1
strlen 的结果转换为 int 类型,因为 * 需要的就是这种类型。如果 sizeof(size_t) > sizeof(int),在 64 位系统上通常会出现这种情况,没有进行转换可能会导致严重问题。 - Daniel Fischer

5
作为GajananH指出的,这是一个毫无意义的努力:
对于strlen函数的使用,str必须以NULL结尾。
如果str以NULL结尾,则:
sprintf(str2, "%.*s", strlen(str), str);

只是过度复杂化的问题:
sprintf(str2, "%s", str);

这本身只是一种过于复杂的表达方式:

strcpy(str2, str);

2
我不太理解使用strlen()的意义。如果strlen()适用于您,那么这意味着您的字符串已经以NULL结尾,如果字符串已经以NULL结尾,那么在%s中放置数字没有实际用途(除非您试图使用小于字符串长度的数字)。
如果您的字符串未以NULL结尾,则strlen()将返回错误值,并且将其用于%s将无法帮助。
相反,我建议您使用strnlen()限制字符串长度并使用返回值作为%s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接