sprintf
имеет чрезвычайно полезное возвращаемое значение, которое позволяет эффективно добавлять.
Вот идиома:
char buffer[HUGE] = {0};
char *end_of_string = &buffer[0];
end_of_string += sprintf( /* whatever */ );
end_of_string += sprintf( /* whatever */ );
end_of_string += sprintf( /* whatever */ );
Вы поняли идею. Это работает, потому что sprintf
возвращает количество символов, которые он записал в буфер, поэтому продвижение вашего буфера на столько позиций оставит вас указывать на '\0'
в конце того, что было написано до сих пор. Поэтому, когда вы передаете обновленную позицию следующей sprintf
, она может сразу же начать писать новые символы.
Сравните с strcpy
, возвращаемое значение которого должно быть бесполезным. Он возвращает вам тот же аргумент, что и вы. Таким образом, добавление с strcpy
подразумевает обход всей первой строки в поисках конца. И затем добавление снова с другим вызовом strcpy подразумевает обход всей первой строки, за которой следует вторая строка, которая теперь живет после нее, в поисках '\0'
. Третий strcpy
будет перебирать строки, которые уже были записаны снова. И так далее.
Таким образом, для многих небольших добавлений к очень большому буферу strcpy
приближается (O ^ n), где n - количество добавлений. Что ужасно
Плюс, как уже упоминалось, они делают разные вещи. sprintf
может использоваться для форматирования чисел, значений указателей и т. Д. В ваш буфер.