sprintf () без завершающего нулевого пространства в C - PullRequest
38 голосов
/ 10 декабря 2008

Есть ли способ использовать функцию C sprintf () без добавления символа '\ 0' в конце ее вывода? Мне нужно написать форматированный текст в середине строки фиксированной ширины.

Ответы [ 7 ]

42 голосов
/ 10 декабря 2008

Невозможно указать sprintf() не писать завершающий ноль. Что вы можете сделать, это использовать sprintf() для записи во временную строку, а затем что-то вроде strncpy(), чтобы скопировать только те байты, которые вам нужны.

25 голосов
/ 10 декабря 2008

sprintf возвращает длину записанной строки (не включая нулевой терминал), вы можете использовать ее, чтобы узнать, где был нулевой терминал, и изменить символ нулевого терминала на что-то другое (то есть пробел). Это было бы более эффективно, чем использование strncpy.

 unsigned int len = sprintf(str, ...);
 str[len] = '<your char here>';
4 голосов
/ 11 декабря 2008

Вы не можете сделать это с помощью sprintf (), но вы можете быть в состоянии с помощью snprintf (), в зависимости от вашей платформы.

Вам нужно знать, сколько символов вы заменяете (но, помещая их в середину строки, вы, вероятно, знаете это в любом случае).

Это работает, потому что некоторые реализации snprintf () НЕ гарантируют, что пишется завершающий символ - предположительно для совместимости с функциями, такими как stncpy ().

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

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

После этого «123» заменяется на «Джо».

В реализациях, где snprintf () гарантирует нулевое завершение, даже если строка обрезана, это не будет работать. Поэтому, если переносимость кода вызывает беспокойство, вам следует избегать этого.

Большинство Windows-версий snprintf () демонстрируют это поведение.

Но MacOS и BSD (и, возможно, linux), по-видимому, всегда заканчиваются нулем.

1 голос
/ 11 декабря 2008

Вы также можете использовать строку фиксированной ширины в качестве строки формата, например:

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

0 голосов
/ 21 февраля 2015

На самом деле этот пример не добавит ноль, если вы используете snprintf:

char name[9] = "QQ40dude";  
unsigned int i0To100 = 63;  
_snprintf(&name[2],2,"%d",i0To100);  
printf(name);// output will be: QQ63dude  
0 голосов
/ 04 июля 2012

Поскольку вы пишете в фиксированную область, вы можете сделать это следующим образом:

// 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;
0 голосов
/ 04 октября 2010

смотрите здесь: http://en.wikipedia.org/wiki/Printf

printf ("%. * S", 3, "abcdef") приведет к печати "abc"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...