如何使用printf打印非空终止字符串,假设我在运行时知道字符串的长度?
答案 0 :(得分:96)
printf("%.*s", length, string);
与其他args一起使用:
printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
// ^^^^ ^^^^^^^^^^^^^^
在C中,您可以使用%.123s
格式指定要输出的最大长度。这意味着输出长度最多为123个字符。 123
可以替换为*
,因此长度将取自printf的参数而不是硬编码。
请注意,这假设string
不包含任何内部空字节(\ 0),因为%.123s
仅限制最大长度而非 exact < / em> length,字符串仍被视为以null结尾。
如果要打印内部为null的非空终止字符串,则不能使用单个printf。请改用fwrite
:
fwrite(string, 1, length, stdout);
有关详细说明,请参阅@M.S.Dousti's answer。
答案 1 :(得分:16)
@KennyTM提供的答案很棒,但有一点微妙。
通常,如果字符串为非null&#34;已终止&#34;,但中间有空字符,则printf("%.*s", length, string);
无法按预期工作。这是因为%.*s
格式字符串要求printf
打印最大的length
个字符,而不是完全 length
字符。
我宁愿使用@William Pursell在OP下的评论中指出的更一般的解决方案:
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