有没有办法使用C sprintf()函数而不在其输出的末尾添加'\ 0'字符?我需要在固定宽度字符串的中间写入格式化文本。
答案 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:
,此示例将不会添加nullchar 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”