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

时间:2008-12-10 18:29:24

标签: c string null printf

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

8 个答案:

答案 0 :(得分:42)

无法告诉sprintf()不要写尾随空值。您可以做的是使用sprintf()写入临时字符串,然后使用strncpy()来复制所需的字节。

答案 1 :(得分:25)

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

 unsigned int len = sprintf(str, ...);
 str[len] = '<your char here>';

答案 2 :(得分:4)

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

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

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

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

snprintf(&message[6],3,"Joe");

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

在snprintf()保证空终止的实现上,即使字符串被截断,这也不起作用。因此,如果需要考虑代码可移植性,则应避免这种情况。

snprintf()的大多数Windows-based versions都会出现此行为。

但是,MacOS和BSD(以及可能是linux)似乎总是空终止。

答案 3 :(得分:1)

您也可以使用固定宽度字符串作为格式字符串,如下所示:

char my_fixed_width_string_format[] = "need 10 chars starting here: %10s";
char my_fixed_width_string[40];
char string_to_print[] = "abcdefghijklmnop";
sprintf(my_fixed_width_string, my_fixed_width_string_format, string_to_print;
printf(my_fixed_width_string);

应该产生

  

从这里开始需要10个字符:abcdefghij

答案 4 :(得分:0)

由于您正在写一个固定区域,您可以这样做:

// pointer to fixed area we want to write to
char* s;

// number of bytes needed, not including the null
int r = snprintf(0, 0, <your va_args here>);

// char following the last char we will write - null goes here
char c = s[r + 1];

// do the formatted write
snprintf(s, r + 1, <your_va_args here>);

// replace what was overwritten
s[r + 1] = c;

答案 5 :(得分:0)

实际上,如果您使用snprintf:

,此示例将不会添加null
char name[9] = "QQ40dude";  
unsigned int i0To100 = 63;  
_snprintf(&name[2],2,"%d",i0To100);  
printf(name);// output will be: QQ63dude  

答案 6 :(得分:0)

这是内存受限设备的选项。为了减少内存消耗,需要权衡速度。有时我必须这样做以更新打印到LCD的字符串的中间。

这个想法是,您首先使用大小为零的缓冲区调用snprintf,以确定哪个索引将被空终止符破坏。

您可以在此处运行以下代码:https://rextester.com/AMOOC49082

#include <stdio.h>
#include <string.h>

int main(void)
{
  char buf[100] = { 'a', 'b', 'c', 'd', 'e' };
  const size_t buf_size = sizeof(buf);
  const int i = 123;

  int result = snprintf(buf, 0, "%i", i);
  if (result < 0)
  {
    printf("snprintf error: %i\n", result);
    return -1;
  }

  int clobbered_index = result; //this index will get the null term written into it

  if (result >= buf_size)
  {
    printf("buffer not large enough. required %i chars\n", result + 1);
    return -1;
  }

  char temp_char = buf[clobbered_index];
  result = snprintf(buf, buf_size, "%i", i); //add result error checking here to catch future mistakes
  buf[clobbered_index] = temp_char;

  printf("buf:%s\n", buf);

  return 0;
}

打印buf:123de

答案 7 :(得分:-2)

看这里:http://en.wikipedia.org/wiki/Printf

  

printf(“%。* s”,3,“abcdef”)将导致打印“abc”