使用带有非null终止字符串的printf

who*_*hoi 97 c string format printf

假设你有一个未null终止的字符串并且你知道它的确切大小,那么如何printf在C中打印该字符串呢?我记得这样的方法,但现在我找不到...

Dar*_*ust 160

printf有可能,它是这样的:

printf("%.*s", stringLength, pointerToString);
Run Code Online (Sandbox Code Playgroud)

无需复制任何内容,无需修改原始字符串或缓冲区.

  • 但无论如何它有危险,有人会在某一天用%s打印这个字符串 (9认同)
  • @user1424739:在您的情况下,`printf` 将打印最多 11 个字符 _or_ 直到遇到 NULL,以先到者为准;在您的示例中 NULL 排在第一位。指定最大长度不会使 NULL 失去其“printf”的“字符串结尾”含义。 (5认同)
  • @Pmod:如果缓冲区没有暴露给外界,则不一定.仅打印字符串的*parts*(当然可以为null终止)也非常有用.如果你真的想看到这个,请看看OpenSER/Kamailio SIP代理,他们避免因为这种技术而复制东西(也使用sprintf). (4认同)
  • 另一个+1.我喜欢它,甚至在几十年之后我就会学习像`printf`这样的基本内容...... :) (3认同)

Tob*_*obu 22

以下是对如何%.*s工作以及指定位置的说明.

printf模板字符串中的转换规范具有以下一般形式:

% [ param-no $] flags width [ . precision ] type conversion
Run Code Online (Sandbox Code Playgroud)

要么

% [ param-no $] flags width . * [ param-no $] type conversion
Run Code Online (Sandbox Code Playgroud)

第二种形式是从参数列表中获取精度:

您还可以指定'*'的精度.这意味着参数列表中的下一个参数(在要打印的实际值之前)用作精度.该值必须为int,如果为负,则忽略该值.

-  glibc手册中的输出转换语法

对于%s字符串格式,精度具有特殊含义:

可以指定精度来指示要写入的最大字符数; 否则,字符串中最多但不包括终止空字符的字符将写入输出流.

-  glibc手册中的其他输出转换

其他有用的变种:

  • "%*.*s", maxlen, maxlen, val 将右对齐,之前插入空格;
  • "%-*.*s", maxlen, maxlen, val 将是左倾的.


小智 20

你可以使用fwrite()来stdout!

fwrite(your_string, sizeof(char), number_of_chars, stdout);
Run Code Online (Sandbox Code Playgroud)

这样您就可以将第一个字符(number_of_chars变量中定义的数字)输出到文件,在本例中为stdout(标准输出,您的屏幕)!

  • 当您要检查包含字符串和零的长缓冲区时非常有用! (2认同)

Tod*_*eed 8

printf("%.*s", length, string) 不管用.

这意味着打印UP TO长度字节或空字节,以先到者为准.如果非空终止的char-char字符在长度之前包含空字节,则printf将停止在那些字节上,而不是继续.

  • null如何出现在非null终止的char-array中?想一想...... (14认同)
  • 如果它不是以null结尾,则null是要包含的字符串的有效字符.这仍然认为数组是以空值终止的,它只是将它视为一个较长的数组,它是从中进行子选择的 - 这意味着如果你有一个包含空值的字符串,这将导致问题. (12认同)
  • 这怎么回答OP的问题? (4认同)
  • 它会对他有用,因为他知道确切的长度 (2认同)