如何使用printf打印非空终止字符串?

Mik*_*ike 60 c string printf

如何使用printf打印一个非空终止的字符串,假设我在运行时知道字符串的长度?

ken*_*ytm 102

printf("%.*s", length, string);
Run Code Online (Sandbox Code Playgroud)

与其他args一起使用:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
//                         ^^^^                       ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

在C中,您可以使用%.123s格式指定要输出的最大长度.这意味着输出长度最多为123个字符.所述123可以被替代*,从而使长度将从printf的的参数,而不是硬编码要采取.

请注意,这假设string不包含任何内部空字节(\ 0),因为%.123s只限制最大长度而不是精确长度,并且字符串仍被视为以null结尾.

如果要打印内部为null的非空终止字符串,则不能使用单个printf.fwrite改为使用:

fwrite(string, 1, length, stdout);
Run Code Online (Sandbox Code Playgroud)

有关详细说明,请参阅@ MSDousti的答案.

  • 注意:在默认参数提升之后,`length`必须在这里输入类型`int`.如果你的`length`变量更大(例如`size_t`)你应该把它强制转换为`(int)`否则你的代码会在`size_t`比`int`宽的平台上破解. (8认同)

M.S*_*sti 19

@KennyTM提供的答案很棒,但有一点微妙.

通常,如果字符串非空"已终止",但在中间具有空字符,printf("%.*s", length, string);则无法按预期工作.这是因为%.*s格式字符串要求printf打印最大length人物,不准确 length的字符.

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

fwrite(string, sizeof(char), length, stdout);
Run Code Online (Sandbox Code Playgroud)

这是一个示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

With printf: AB
With fwrite: AB CD
Run Code Online (Sandbox Code Playgroud)

  • `sizeof (char)` 根据定义为 1。此外,`NULL` 是一个空 *pointer* 常量。 (2认同)
  • @KeithThompson,`sizeof (char)` 更具语义化。此外,“\0”比“0”更具语义。但谁在乎 ;-) (2认同)