如何使用printf打印非空终止的string?

我怎么能打印一个非null终止的string使用printf,假设我知道在运行时string的长度?

printf("%.*s", length, string); 

与其他参数一起使用:

 printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); // ^^^^ ^^^^^^^^^^^^^^ 

在C中,您可以指定以%.123s格式输出的最大长度。 这意味着输出长度最多为123个字符。 123可以replace为* ,所以长度将取自printf的参数,而不是硬编码。

请注意,这假定string不包含任何内部空字节(\ 0),因为%.123s仅限制最大长度不是确切的长度,并且string仍然被视为空终止。

如果要打印内部为空的非空终止的string,则不能使用单个printf。 改用fwrite

 fwrite(string, 1, length, stdout); 

详细解释请参阅@ MSDousti的答案 。

由@KennyTM提供的答案是伟大的,但有一个微妙的。

一般来说,如果string非空“终止”,但在中间有一个空字符, printf("%.*s", length, string); 不按预期工作。 这是因为%.*s格式string要求printf打印最大 length字符,而不是length字符。

我宁愿使用@William Pursell在OP下的评论中指出的更一般的解决scheme:

 fwrite(string, sizeof(char), length, stdout); 

这是一个示例代码:

 #include <stdio.h> int main(void) { size_t length = 5; char string[length]; string[0] = 'A'; string[1] = 'B'; string[2] = 0; // null character in the middle string[3] = 'C'; string[4] = 'D'; printf("With printf: %.*s\n", length, string); printf("With fwrite: "); fwrite(string, sizeof(char), length, stdout); printf("\n"); return 0; } 

输出:

 With printf: AB With fwrite: AB CD