Vairāk
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?
321
3
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ādasrc
, virknes, uz kuru norādadest
, beigām:Šeit ir piemērs no cplusplus.com:
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
unstrcat_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ā:Tātad jūsu problēmu varētu atrisināt šādi:
Mēģinājums modificēt virknes literālus ir nedefinēta uzvedība, kas ir kaut kas līdzīgs:
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:
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:
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.
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.