sprintf()没有在C中尾随空格

zar*_*tra 41 c string null printf

有没有办法使用C sprintf()函数而不在其输出的末尾添加'\ 0'字符?我需要在固定宽度字符串的中间写入格式化文本.

Gre*_*ill 43

没有办法告诉sprintf()不要写尾随空值.你可以做的是sprintf()用来写一个临时字符串,然后像strncpy()只复制你想要的字节.

  • 或者使用 memmove() 或 memcpy() 而不是 strncpy()。 (3认同)
  • Roddy:snprintf函数总是为null终止其输出.如果将大小n传递给snprintf,它将写入最多n-1个字符,后跟一个尾随'\ 0'. (2认同)
  • @yanbellavance:您的示例并不像您声称的那样工作,并且仅打印“QQ6”。 (2认同)

Dou*_* T. 25

sprintf返回写入的字符串的长度(不包括空终端),您可以使用它来知道空终端的位置,并将空终端字符更改为其他位置(即空格).这比使用strncpy更有效.

 unsigned int len = sprintf(str, ...);
 str[len] = '<your char here>';
Run Code Online (Sandbox Code Playgroud)


Rod*_*ddy 6

您无法使用 sprintf() 执行此操作,但您可以使用 snprintf() 执行此操作,具体取决于您的平台。

您需要知道要替换多少个字符(但是当您将它们放入字符串的中间时,您可能已经知道了)。

这是有效的,因为 snprintf() 的某些实现不保证写入终止字符 - 大概是为了与 stncpy() 等函数兼容。

char message[32] = "Hello 123, it's good to see you.";

snprintf(&message[6],3,"Joe");
Run Code Online (Sandbox Code Playgroud)

在此之后,“123”被替换为“Joe”。

在 snprintf() 即使字符串被截断也能保证空终止的实现上,这将不起作用。所以如果代码可移植性是一个问题,你应该避免这种情况。

大多数基于 Windows的 snprintf()版本都表现出这种行为。

但是,MacOS和 BSD(也许还有 linux)似乎总是以 null 结尾。