Работя на C и трябва да конкатенирам няколко неща.
В момента имам следното:
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
Сега, ако имате опит в C, съм сигурен, че осъзнавате, че това ви дава грешка при сегментиране, когато се опитате да го стартирате. И така, как да го заобиколя?
В езика C "низовете" са обикновени масиви от char
. Затова не можете да ги конкатенирате директно с други "низове".
Можете да използвате функцията strcat
, която добавя низа, посочен от src
, към края на низа, посочен от dest
:
char *strcat(char *dest, const char *src);
Ето един пример от cplusplus.com:
char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");
За първия параметър трябва да предоставите самия буфер на местоназначението. Буферът на дестинацията трябва да бъде буфер от масив от символи. Напр: char buffer[1024];
Уверете се, че първият параметър има достатъчно място, за да съхрани това, което се опитвате да копирате в него. Ако имате възможност, по-безопасно е да използвате функции като: strcpy_s
и strcat_s
, където изрично трябва да посочите размера на целевия буфер.
Забележка: Литерал на низ не може да се използва като буфер, тъй като той е константа. Затова винаги трябва да заделите масив от символи за буфера.
Върнатата стойност на strcat
може просто да се игнорира, тя просто връща същия указател, който е бил подаден като първи аргумент. Тя е въведена за удобство и ви позволява да свържете извикванията в един ред код:
strcat(strcat(str, foo), bar);
Така че вашият проблем може да бъде решен по следния начин:
char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
Опитът за промяна на символни низове е недефинирано поведение, каквото е нещо подобно:
strcat ("Hello, ", name);
ще се опита да направи. То ще се опита да добави символа име
към края на символа "Hello, "
, който не е добре дефиниран.
Опитайте нещо такова. То постига това, което изглежда се опитвате да направите:
char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);
Създава се буферна област, която може да бъде променяна, и след това в нея се копират както литералният низ, така и друг текст. Просто внимавайте с препълването на буфера. Ако контролирате входните данни (или ги проверявате предварително), е добре да използвате буфери с фиксирана дължина, както направих аз.
В противен случай трябва да използвате стратегии за смекчаване на последиците, като например заделяне на достатъчно памет от купчината, за да сте сигурни, че можете да се справите. С други думи, нещо като:
const static char TEXT[] = "TEXT ";
// Make *sure* you have enough space.
char *message = malloc (sizeof(TEXT) + strlen(var) + 1);
if (message == NULL)
handleOutOfMemoryIntelligently();
strcpy (message, TEXT);
strcat (message, var);
// Need to free message at some point after you're done with it.
Първият аргумент на strcat() трябва да може да побере достатъчно място за конкатенирания низ. Затова заделете буфер с достатъчно място, за да приеме резултата.
char bigEnough[64] = "";
strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);
/* and so on */
Strcat() ще конкатенира втория аргумент с първия и ще съхрани резултата в първия аргумент, като върнатият char* е просто този първи аргумент и е само за ваше удобство.
Не получавате новоразпределен низ с конкатенация на първия и втория аргумент, което предполагам, че сте очаквали въз основа на вашия код.