Kaip sujungti const/literalines eilutes C kalba?

Dirbu C kalba ir turiu sujungti keletą dalykų.

Dabar turiu štai ką:

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

Dabar, jei turite C kalbos patirties, esu tikras, kad suprantate, jog bandant paleisti šį failą, atsiranda segmentacijos klaida. Taigi, kaip tai apeiti?

Sprendimas

C kalboje "eilutės" yra tiesiog char masyvai. Todėl jų negalima tiesiogiai sujungti su kitomis eilutėmis.

Galite naudoti funkciją strcat, kuri eilutę, į kurią nurodo src, prideda prie eilutės, į kurią nurodo dest, galo:

char *strcat(char *dest, const char *src);

Štai pavyzdys iš cplusplus.com:

char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");

Pirmajam parametrui reikia nurodyti patį paskirties buferį. Paskirties buferis turi būti simbolių masyvo buferis. Pvz: char buffer[1024];

Patikrinkite, kad pirmajame parametre būtų pakankamai vietos saugoti tai, ką į jį bandote nukopijuoti. Jei turite galimybę, saugiau naudoti funkcijas, pvz: strcpy_s ir strcat_s, kuriose aiškiai nurodomas paskirties buferio dydis.

Pastaba: eilutės literalas negali būti naudojamas kaip buferis, nes jis yra konstanta. Taigi, buferiui visada reikia priskirti char masyvą.

Į strcat grąžinamąją vertę galima tiesiog nekreipti dėmesio, ji tiesiog grąžina tą pačią rodyklę, kuri buvo perduota kaip pirmasis argumentas. Ji pateikiama patogumo sumetimais ir leidžia sujungti iškvietimus į vieną kodo eilutę:

strcat(strcat(str, foo), bar);

Taigi jūsų problemą galima išspręsti taip:

char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
Komentarai (14)

Bandymas keisti eilutės literalus yra neapibrėžtas elgesys, todėl pvz:

strcat ("Hello, ", name);

bus bandoma tai padaryti. Jis bandys prie eilutės name eilutės galo pridėti eilutę `"Hello, "``, kuri nėra gerai apibrėžta.

Pabandykite ką nors panašaus. Taip pasieksite tai, ką, atrodo, bandote padaryti:

char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);

Sukuriama buferinė sritis, kurią galima keisti, ir į ją nukopijuojama eilutės raidė bei kitas tekstas. Tik būkite atsargūs dėl buferio perpildymo. Jei kontroliuojate įvesties duomenis (arba iš anksto juos tikrinate), galima naudoti fiksuoto ilgio buferius, kaip aš.

Priešingu atveju turėtumėte naudoti mažinimo strategijas, pavyzdžiui, skirti pakankamai atminties iš krūvos, kad užtikrintumėte, jog galėsite su tuo susidoroti. Kitaip tariant, pvz:

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.
Komentarai (5)

Pirmajame strcat() argumente turi būti pakankamai vietos sutrauktai eilutei. Todėl paskirkite buferį, kuriame būtų pakankamai vietos rezultatui priimti.

char bigEnough[64] = "";

strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);

/* and so on */

Strcat() sujungia antrąjį argumentą su pirmuoju argumentu ir rezultatą išsaugo pirmajame argumente, o grąžinamas char* yra tiesiog šis pirmasis argumentas ir tik jūsų patogumui.

Jūs negaunate naujai paskirstytos eilutės su sujungtais pirmuoju ir antruoju argumentu, ko, spėju, tikėjotės pagal savo kodą.

Komentarai (0)