使用%.s的sprintf用法

时间:2012-11-08 12:39:51

标签: c printf

使用像这样的sprintf

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

我想用strlen(str)代替40这样的值。我该怎么做?我尝试用strlen(str)替换40,但是不起作用。给予像

这样的价值
#define len strlen(str)

并且使用%.len不起作用,因为%.len用于“”。

3 个答案:

答案 0 :(得分:9)

使用*字符。

sprintf(/* ... */, "%.*s", (int) strlen(str), str);

如果您使用C99,snprintf也适用。

  

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

答案 1 :(得分:5)

正如GajananH所指出的那样,这是一种毫无意义的努力:

要使strlen起作用,str必须以NULL结尾。

如果str为NULL,则终止:

sprintf(str2, "%.*s", strlen(str), str);

只是过于复杂:

sprintf(str2, "%s", str);

这本身只是一个过于复杂的问题:

strcpy(str2, str);

答案 2 :(得分:2)

我真的不明白使用strlen()的意义。如果strlen()适合你,那意味着你的字符串是NULL终止的,如果字符串是NULL终止,则没有真正使用为%s添加数字(除非你试图使用小于字符串的长度。

如果您的字符串未以NULL结尾,那么strlen()将返回错误的值,并且将%s用于%s无效。

相反,我建议您使用strnlen()对字符串长度进行限制,并使用{{1}}的返回值。