Конкатенация строк в C / C ++ - PullRequest
2 голосов
/ 18 марта 2011

Как объединить строки с C / C ++?

Я пробовал следующие способы:

PS: errorInfo - это символ * Я должен вернуть его.

        errorInfo = strcat("Workflow: ", strcat(
            workflowToString(workflow).utf8(), strcat(" ERROR: ",
                    errorCode.utf8)));

        sprintf(errorInfo, "Workflow %s ERROR: %s",
            workflowToString(workflow).utf8(), errorCode.utf8());

        errorInfo = "Workflow: " + workflowToString(workflow).utf8() + " ERROR: " + errorCode.utf8;

Просто компилируется sprintf, но при запуске моего приложения происходит сбой.

PS: я использую NDK из Android

Ответы [ 6 ]

17 голосов
/ 18 марта 2011

Существует НЕ такой язык, как C / C ++. Есть C и C ++.

  • В C ++ вы объединяете std::string с помощью operator+
  • В C вы используете strcat

Я знаю, что это не совсем отвечает на ваш вопрос, это просто крик:)

3 голосов
/ 18 марта 2011

Согласно эта страница strcat выполняет следующие действия:

Добавляет копию исходной строки в строку назначения.Завершающий нулевой символ в месте назначения заменяется первым символом источника, а новый нулевой символ добавляется в конце новой строки, образованной объединением обоих в месте назначения.

В вашемреализация, однако, "Workflow: " является константной строкой.Вы не можете изменить эту строку, как это делает strcat.Для этого создайте строку типа:

char message[1000];
strcpy(message, "Workflow: ");
strcat(message, "other string");
....

Однако будьте осторожны с кодировкой символов utf8, поскольку одна кодовая точка utf8 может быть кратна char s длиной.

2 голосов
/ 18 марта 2011

Конкатенация почти всегда является неправильной идиомой для построения строк, особенно в C. Она подвержена ошибкам, загромождает ваш код и имеет очень плохую асимптотическую производительность (то есть O(n^2) вместо O(n) для построения строки длины n).

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

snprintf(buf, sizeof buf, "Workflow: %s ERROR: %s", workflow, error);

или если вы пишете в файл / сокет / и т.д. и не нужно хранить полученную строку в памяти, просто используйте fprintf для начала.

1 голос
/ 10 апреля 2017

Существует множество способов объединения в C при использовании Android NDK:

Я использовал два способа:

  • strcat
  • sprintf

вот пример:

введите здесь код

strcat

char* buffer1=(char*)malloc(250000);
char* buffer2=(char*)malloc(250000);
char* buffer3=(char*)malloc(250000);

buffer1 = strcat(buffer1, buffer2);

sprintf

sprintf(buffer3,"this is buffer1: %s and this is buffer2:%s",buffer1,buffer2);`

sprintf возвращает длину вашей строки

strcat не рекомендуется, так как он использует больше памяти. Вы можете использовать sprintf или другие, например strcpy.

Надеюсь, это поможет.

1 голос
/ 18 марта 2011

С строковыми литералами вы можете просто использовать:

char str[] = "foo" " bar";
const char *s = " 1 " " 2 ";
s = " 3 " " 4 ";
1 голос
/ 18 марта 2011

Используя strcat(), вы работаете в c, а не c ++. C не собирается автоматически управлять памятью для вас. c может сбивать с толку, поскольку иногда кажется, что он имеет строковый тип данных, когда все, что он делает - это предоставляет вам строковый интерфейс для массивов символов. Во-первых, первый аргумент strcat() должен быть доступен для записи и иметь достаточно места для добавления второй строки.

char *out = strcat("This", "nThat");

просит c топнуть строковую литеральную память.

Как правило, вы НИКОГДА не должны использовать strcat()/sprintf, как в приведенном выше «выбранном» ответе. Вы можете перезаписать память таким образом. Вместо этого используйте strncat()/snprintf(), чтобы избежать переполнения буфера. Если вы не знаете, какой размер передать в "n" в strncat(), вы, вероятно, делаете что-то не так.

Один из способов сделать это в c будет:

 #define ERROR_BUF_SIZE  2048  // or something big enough, you have to know in c




char errorInfo[ERROR_BUF_SIZE];

   snprintf(errorInfo, ERROR_BUF_SIZE, "Workflow %s ERROR: %s",
            workflowToString(workflow).utf8(), errorCode.utf8());

или аналогично, используя strncpy/strncat

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