Kā savienot konst/literālas virknes C valodā?

Es strādāju C valodā, un man ir jāsavieno dažas lietas.

Šobrīd man ir šāds:

message = strcat("TEXT ", var);

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

Tagad, ja jums ir pieredze C valodā, esmu pārliecināts, ka jūs saprotat, ka, mēģinot to palaist, rodas segmentācijas kļūda. Kā to apiet?

Risinājums

C valodā "virknes" ir vienkārši char masīvi. Tāpēc tās nevar tieši savienot ar citām "virknēm".

Var izmantot funkciju strcat, kas pievieno virkni, uz kuru norāda src, virknes, uz kuru norāda dest, beigām:

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

Šeit ir piemērs no cplusplus.com:

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

Pirmajam parametram ir jānorāda pats galamērķa buferis. Galamērķa buferim jābūt char masīva buferim. Piem: buferis[1024];`

Pārliecinieties, ka pirmajā parametrā ir pietiekami daudz vietas, lai tajā varētu saglabāt to, ko mēģināt tajā kopēt. Ja tas ir iespējams, drošāk ir izmantot šādas funkcijas: strcpy_s un strcat_s, kurās ir skaidri jānorāda galamērķa bufera lielums.

Piezīme_: Virknes literālu nevar izmantot kā buferi, jo tas ir konstante. Tādējādi buferim vienmēr ir jāizdala char masīvs.

strcat atgriešanas vērtību var vienkārši ignorēt, tā tikai atgriež to pašu rādītāju, kas tika nodots kā pirmais arguments. Tas ir ērtības labad un ļauj ķēdei savienot izsaukumus vienā koda rindā:

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

Tātad jūsu problēmu varētu atrisināt šādi:

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

Mēģinājums modificēt virknes literālus ir nedefinēta uzvedība, kas ir kaut kas līdzīgs:

strcat ("Hello, ", name);

mēģinās to izdarīt. Tas mēģinās pievienot virknei Name virkni virknes literāla "Hello, " beigās, kas nav precīzi definēts.

Izmēģiniet kaut ko šādu. Tas panāk to, ko jūs, šķiet, mēģināt izdarīt:

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

Tas izveido bufera apgabalu, kuru ir atļauts modificēt, un pēc tam tajā kopē gan virknes literālu, gan citu tekstu. Tikai jāuzmanās no bufera pārslodzes. Ja jūs kontrolējat ievades datus (vai pārbaudāt tos pirms tam), ir labi izmantot fiksēta garuma buferus, kā tas ir manā gadījumā.

Pretējā gadījumā jāizmanto mazināšanas stratēģijas, piemēram, jāpiešķir pietiekami daudz atmiņas no kaudzes, lai nodrošinātu, ka varat to apstrādāt. Citiem vārdiem sakot, kaut ko līdzīgu:

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.
Komentāri (5)

Strcat() pirmajam argumentam ir jābūt pietiekami ietilpīgam, lai saturētu pietiekami daudz vietas sakopotajai virknei. Tāpēc piešķiriet buferi, kurā ir pietiekami daudz vietas, lai saņemtu rezultātu.

char bigEnough[64] = "";

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

/* and so on */

strcat() apvienos otro argumentu ar pirmo argumentu un rezultātu saglabās pirmajā argumentā, un atgrieztā har* ir vienkārši šis pirmais arguments, un tikai jūsu ērtībai.

Jūs nesaņemat jaunu piešķirtu virkni ar pirmo un otro argumentu, kas, spriežot pēc jūsu koda, ir gaidīts.

Komentāri (0)