sprintf () без запаздывающего пустого пространства в C

Это должно сделать трюк. Украден из списка рассылки python .

from datetime import datetime, timedelta

today = datetime.today()
yesterday = today - timedelta(1)

40
задан zaratustra 11 December 2008 в 04:29
поделиться

4 ответа

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

42
ответ дан Greg Hewgill 4 August 2019 в 22:58
поделиться

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

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

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

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

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

После этого "123" заменяется "Joe".

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

Большинство версии на базе Windows из snprintf () показывают это поведение.

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

4
ответ дан Roddy 4 August 2019 в 22:58
поделиться

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

 unsigned int len = sprintf(str, ...);
 str[len] = '<your char here>';
25
ответ дан Doug T. 4 August 2019 в 22:58
поделиться

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

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

1
ответ дан Nathan Fellman 4 August 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: