如何使用printf打印非空终止的字符串,假设我知道运行时字符串的长度?如何使用printf打印非空终止的字符串?
回答
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。
感谢您的快速回答可能的复制! – Mike 2010-01-26 06:17:20
注意:在默认参数促销后,'length'在这里必须有'int'类型。如果你的'length'变量比较大(例如'size_t'),你应该把它转换为'(int)',否则你的代码会在size_t比int更宽的平台上中断。 – 2014-08-04 04:25:46
由@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
根据定义,“sizeof(char)'是1。此外,'NULL'具体是一个空*指针*常量。 – 2014-08-04 03:37:08
@KeithThompson,'sizeof(char)'更具语义。另外,''\ 0'比'0'更具语义。但谁在乎 ;-) – 2017-01-12 15:58:45
- 1. JavaScript WebSocket非空终止的字符串
- 2. Ç - 原始打印字符串中的所有非打印字符的printf
- 3. 是否printf终止每个字符串与空字符?
- 4. 如何使用printf打印空白字符?
- 5. 如何使用printf在字符串中打印多个变量?
- 6. 如何用'printf'打印'%'字符?
- 7. awk:非终止字符串
- 8. printf()将不会打印字符串c
- 9. printf不打印完整字符串
- 10. “printf” 上不打印字符串立刻
- 11. SQL字符串空终止?
- 12. 空终止字符串
- 13. C字符串空终止
- 14. 如何使用printf从字符串数组中打印单个字符?
- 15. 巴什 - 如何打印多行字符串(以“\ n”)用printf
- 16. 空终止字符数组(C-字符串)不打印而不for循环
- 17. C字符数组打印为字符串错误,接受空终止?
- 18. printf()打印垃圾字符
- 19. 打印给定字符串中的非打印字符?
- 20. 传递非空值终止字符串非托管代码
- 21. printf()的困惑 - 印刷(空)时,试图打印字符串,并打印缓冲区时,打印正确的值
- 22. 我如何使用空字符串来终止?
- 23. 使用'printf'返回字符串,不打印它
- 24. 将非ASCII字符分配给宽字符并使用printf进行打印
- 25. C的printf不打印字符串(字符数组)出来
- 26. 程序集printf - 仅打印字符串的第一个字符
- 27. 字符串如何打印没有终止符号的名称;(分号)?
- 28. ATOF和非空终止字符数组
- 29. 比较非空终止字符数组
- 30. 如何打印非ASCII字符用C
为什么不使用fwrite的? – 2010-01-26 08:21:11
如果它不是空终止的,那么根据定义它不是一个字符串。 – 2014-08-04 03:36:45
这只是不是一个_c string_,因为这将是在其他语言中一个有效的字符串..虽然是“字符的非空值终止阵列”会更准确,我敢肯定这是普遍理解。 – Willdorf 2016-07-29 19:58:19