Как добавить строки с помощью sprintf?

Я сталкиваюсь с серьезной проблемой с sprintf.

Предположим, что мой фрагмент кода:

sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.

Некоторая сотня спринтов....

Если мне действительно нравится это, то, что это было перезаписанным.

Как я могу постараться не перезаписывать использование sprintf. Если я даю printf в конце, я хочу видеть все строки.

59
задан Starfish 7 January 2012 в 15:14
поделиться

7 ответов

Вам нужно:

sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");

и, конечно же, ваш буфер должен быть достаточно большим.

100
ответ дан 24 November 2019 в 17:58
поделиться

Вы просто добавляете строковые литералы? Или вы собираетесь добавлять различные типы данных (целые числа, числа с плавающей запятой и т. Д.)?

Было бы проще выделить это в отдельную функцию (далее предполагается 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 , которое в большинстве реализаций представляет собой количество байтов, записанных в место назначения. В этой реализации есть несколько дыр, но она должна дать вам некоторые идеи.

3
ответ дан 24 November 2019 в 17:58
поделиться

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;
}
12
ответ дан 24 November 2019 в 17:58
поделиться
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"));
64
ответ дан 24 November 2019 в 17:58
поделиться

В целях безопасности (переполнение буфера) я рекомендую использовать 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");
29
ответ дан 24 November 2019 в 17:58
поделиться

А как насчет:

char s[100] = "";

sprintf(s, "%s%s", s, "s1");

sprintf(s, "%s%s", s, "s2");

sprintf(s, "%s%s", s, "s3");

printf("%s", s);

Но учтите возможные переполнения буфера!

-4
ответ дан 24 November 2019 в 17:58
поделиться

Почему вы хотите использовать sprintf для конкатенации строк, когда есть методы, специально предназначенные для того, что вам нужно, например strcat и strncat ?

6
ответ дан 24 November 2019 в 17:58
поделиться
Другие вопросы по тегам:

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