2010-01-26 63 views
48

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

+3

为什么不使用fwrite的? – 2010-01-26 08:21:11

+4

如果它不是空终止的,那么根据定义它不是一个字符串。 – 2014-08-04 03:36:45

+3

这只是不是一个_c string_,因为这将是在其他语言中一个有效的字符串..虽然是“字符的非空值终止阵列”会更准确,我敢肯定这是普遍理解。 – Willdorf 2016-07-29 19:58:19

回答

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

使用与其他ARGS一起:

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

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

注意,这假定string不包含任何内部空字节(\ 0),因为仅%.123s约束最大长度不是确切长度,和字符串仍视为空值终止。

如果您想打印一个非空值终止字符串内部空,则不能使用到一个printf。使用fwrite来代替:

fwrite(string, 1, length, stdout); 

的详细说明,请参见@M.S.Dousti's answer

+0

感谢您的快速回答可能的复制! – Mike 2010-01-26 06:17:20

+5

注意:在默认参数促销后,'length'在这里必须有'int'类型。如果你的'length'变量比较大(例如'size_t'),你应该把它转换为'(int)',否则你的代码会在size_t比int更宽的平台上中断。 – 2014-08-04 04:25:46

13

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

通常,如果字符串非空“已终止”,但中间为空字符,则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 
+1

根据定义,“sizeof(char)'是1。此外,'NULL'具体是一个空*指针*常量。 – 2014-08-04 03:37:08

+0

@KeithThompson,'sizeof(char)'更具语义。另外,''\ 0'比'0'更具语义。但谁在乎 ;-) – 2017-01-12 15:58:45

相关问题