Я сталкиваюсь с серьезной проблемой с sprintf.
Предположим, что мой фрагмент кода:
sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.
Некоторая сотня спринтов....
Если мне действительно нравится это, то, что это было перезаписанным.
Как я могу постараться не перезаписывать использование sprintf. Если я даю printf в конце, я хочу видеть все строки.
Вам нужно:
sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");
и, конечно же, ваш буфер должен быть достаточно большим.
Вы просто добавляете строковые литералы? Или вы собираетесь добавлять различные типы данных (целые числа, числа с плавающей запятой и т. Д.)?
Было бы проще выделить это в отдельную функцию (далее предполагается C99):
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
int appendToStr(char *target, size_t targetSize, const char * restrict format, ...)
{
va_list args;
char temp[targetSize];
int result;
va_start(args, format);
result = vsnprintf(temp, targetSize, format, args);
if (result != EOF)
{
if (strlen(temp) + strlen(target) > targetSize)
{
fprintf(stderr, "appendToStr: target buffer not large enough to hold additional string");
return 0;
}
strcat(target, temp);
}
va_end(args);
return result;
}
И вы могли бы использовать это так:
char target[100] = {0};
...
appendToStr(target, sizeof target, "%s %d %f\n", "This is a test", 42, 3.14159);
appendToStr(target, sizeof target, "blah blah blah");
и т. Д.
Функция возвращает значение из vsprintf
, которое в большинстве реализаций представляет собой количество байтов, записанных в место назначения. В этой реализации есть несколько дыр, но она должна дать вам некоторые идеи.
A snprintfcat ()
оболочка для snprintf ()
:
size_t
snprintfcat(
char* buf,
size_t bufSize,
char const* fmt,
...)
{
size_t result;
va_list args;
size_t len = strnlen( buf, bufSize);
va_start( args, fmt);
result = vsnprintf( buf + len, bufSize - len, fmt, args);
va_end( args);
return result + len;
}
int length = 0;
length += sprintf(Buffer+length, "Hello World");
length += sprintf(Buffer+length, "Good Morning");
length += sprintf(Buffer+length, "Good Afternoon");
Вот версия с некоторой устойчивостью к ошибкам. Это полезно, если вам все равно, когда случаются ошибки, пока вы можете продолжать свой веселый путь, когда они случаются.
int bytes_added( int result_of_sprintf )
{
return (result_of_sprintf > 0) ? result_of_sprintf : 0;
}
int length = 0;
length += bytes_added(sprintf(Buffer+length, "Hello World"));
length += bytes_added(sprintf(Buffer+length, "Good Morning"));
length += bytes_added(sprintf(Buffer+length, "Good Afternoon"));
В целях безопасности (переполнение буфера) я рекомендую использовать snprintf ()
const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); int length = 0; length += snprintf(Buffer+length, MAX_BUF-length, "Hello World"); length += snprintf(Buffer+length, MAX_BUF-length, "Good Morning"); length += snprintf(Buffer+length, MAX_BUF-length, "Good Afternoon");
А как насчет:
char s[100] = "";
sprintf(s, "%s%s", s, "s1");
sprintf(s, "%s%s", s, "s2");
sprintf(s, "%s%s", s, "s3");
printf("%s", s);
Но учтите возможные переполнения буфера!
Почему вы хотите использовать sprintf
для конкатенации строк, когда есть методы, специально предназначенные для того, что вам нужно, например strcat
и strncat
?