C Merkkijonon ketjutus

C String Concatenation

Ketjutus on prosessi, jolla toinen merkkijono lisätään ensimmäisen merkkijonon loppuun. Tässä artikkelissa aiomme keskustella siitä, miten ketjutetaan merkkijonot C: ssä käyttämällä erilaisia ​​menetelmiä.

Vakio C -kirjastotoiminto, jota käytetään merkkijonon ketjuttamiseen, on strcat ().



Toiminnon prototyyppi:

$hiiltyä * strcat (str1,str2);

jossa str1 on ensimmäinen merkkijono ja str2 on toinen merkkijono. Funktion palautusarvo on osoitin yhdistetylle merkkijonolle.



Nyt esimerkin avulla näemme kuinka ketjutus suoritetaan.



Esimerkki 1:

$ strcat (str1,str2);
missä str1 on Bella
str2 on Whitmann

merkkijonon yhdistämisen jälkeen,ensimmäinen merkkijono tulee olemaan

str1 Bella Whitmann
str2 Whitmann

merkkijono2 pysyy samana.

Esimerkki2:

$ strcat (str2,str1);
missä str1 on Bella
str2 on Whitmann

merkkijonon yhdistämisen jälkeen,ketjutettu merkkijono on

str1 Bella
str2 Bella Whitmann

merkkijono1 pysyy samana.

Ilmoitus C -otsikkotiedostossa

Merkkijonon käsittelytoiminnot on ilmoitettu otsikkotiedoston alla. Jos haluat käyttää ketjutuksen vakiotoimintoa, tämä otsikkotiedosto on sisällytettävä.



Näin ollen voimme saavuttaa merkkijonon yhdistämisen kahdella tavalla. Yksi on Standard C -kirjastotoiminnon käyttäminen ja toinen ilman C -kirjasto -toimintoa. Seuraavassa on esimerkkiohjelmia, jotka osoittavat molemmat tavat. Merkkijonon yhdistäminen ilman C -kirjasto -toimintoa voidaan toteuttaa monella tavalla.

Keskustelemme siitä myös seuraavissa osissa esimerkin avulla.

Kahden merkkijonon ketjutus käyttämällä C -kirjastotoimintoa

#sisältää

#sisältää

#define BUF_SIZE 256
inttärkein()
{
hiiltyäS1[BUF_SIZE],S2[BUF_SIZE]; / * Kaksi merkkijonopuskuria */

printf ('Kirjoita ensimmäinen merkkijono n''); ] /* Tulosta viesti konsoliin, jotta käyttäjä voi syöttää ensimmäisen merkkijonon*/
fgets (S1,BUF_SIZE,stdin); / * tallenna käyttäjän syöttöjono S1 -puskuriin */
S1[ strlen (S1)-1] = '' 0'';

printf ('Kirjoita toinen merkkijono n'');/* Tulosta viesti käyttäjälle syöttääksesi toisen merkkijonon*/
fgets (S2,BUF_SIZE,stdin); / * tallenna käyttäjän syöttöjono S2 -puskuriin */
S2[ strlen (S2)-1] = '' 0'';

strcat (S1,S2); / *Kutsu vakiotoiminto S1- ja S2 -merkkijonoilla */

printf ('' nKetjutettu merkkijono on %s n n'',S1); / *Lähtö: S1 liitetään S2: een */

palata 0;
}

Tilannekuvia ohjelmasta ja tuotoksesta:

Teksti Kuvaus luodaan automaattisesti

Teksti Kuvaus luodaan automaattisesti keskitason luottamuksella

Kahden merkkijonon ketjutus ilman kirjasto -toimintoa

Silmukan avulla voit kopioida toisen merkkijonon ensimmäisen merkkijonon lopussa.

#sisältää

#sisältää

#define BUF_SIZE 256
inttärkein()
{
hiiltyäS1[BUF_SIZE],S2[BUF_SIZE]; /* Ilmoita puskurit S1, S2 molemmille merkkijonoille*/
intpituus= 0,i,j; /*Silmukan kulkemiseen tarvittavat muuttujat*/

printf ('Kirjoita ensimmäinen merkkijono'); / * Tulosta käyttäjän viesti syöttääksesi ensimmäisen merkkijonon */
fgets (S1,BUF_SIZE,stdin); /* käyttäjän syöttöjono tallennetaan S1: een*/
S1[ strlen (S1)-1] = '' 0'';

printf ('Kirjoita toinen merkkijono'); / * Tulosta käyttäjän viesti syöttääksesi toisen merkkijonon */
fgets (S2,BUF_SIZE,stdin); /* käyttäjän syöttöjono tallennetaan S2: een*/
S2[ strlen (S2)-1] = '' 0'';
/* Kierrä ensimmäinen merkkijono löytääksesi pituuden S1*/
varten(i=0;S1[i]! ='' 0'';i++)
{
pituus=pituus+1;
}

/*pituudella on S1: n loppu, aloita pituudesta ja kopioi koko S2 S1: een*/
varten(i=pituus,j=0;S2[j]! ='' 0'';i++,j++)
{
S1[i]=S2[j];
S1[i]='' 0'';
}

/ *Tulosta S1, yhdistetty tulos */
printf ('' nKetjutettu merkkijono on %s n n'',S1);
palata 0;
}

Tilannekuvia ohjelmasta ja tuotoksesta:

Teksti Kuvaus luodaan automaattisesti

Teksti Kuvaus luodaan automaattisesti

Toinen tapa ilman kirjastotoimintoa

Ketjutus käyttäen rekursiota:

Funktiota stringconcatenate () käytetään merkkijonon 1 pituuden saamiseen. Jos S2 on tyhjä, S2: lle annetaan nollamerkki.

Jos S2: lle ei ole määritetty nollamerkkiä, lisää S2: n elementti S1: n loppuun eli S1 [i+j] = S2 [j], tämä lisää i: n arvoa merkkijonossa.

Funktiota kutsutaan itseksi ohittamalla reformoidut merkkijonot (S1, S2) argumenttina. Sitä kutsutaan uudestaan ​​ja uudestaan, kunnes S2 on tyhjä.

Ketjutettu S1 tulostetaan main () nimellä

#sisältää

#sisältää

#define BUF_SIZE 256

/ * rekursiivinen funktio merkkijonon yhdistämisen toteuttamiseksi yllä olevan kuvauksen mukaisesti */
mitätönstringconcatenate(hiiltyä *S1,hiiltyä *S2)
{
staattinen inti=0;
staattinen intj;
j= strlen (S1);
jos(!S2[i])
{
S2[i]='' 0'';
}
muu
{
S1[j] =S2[i];
S1[j+1] = '' 0'';
i++;
stringconcatenate(S1,S2);
}
}
inttärkein()
{
hiiltyäS1[BUF_SIZE],S2[BUF_SIZE];

printf ('Anna ensimmäisen merkkijonon arvo:'); / * käyttäjän viesti syötettäväksi 1. merkkijono */
fgets (S1,BUF_SIZE,stdin); / * käyttäjän syöttö ensimmäinen merkkijono, tallenna S1: een */
S1[ strlen (S1)-1] = '' 0'';

printf ('Anna toisen merkkijonon arvo:'); / * käyttäjän viesti syötettäväksi 2. merkkijono */
fgets (S2,BUF_SIZE,stdin); / * käyttäjän syöttämä ensimmäinen merkkijono, tallenna S2: een */
S2[ strlen (S2)-1] = '' 0'';

stringconcatenate(S1,S2); / * Soita toimintoon parametreilla S1, S2 */

printf ('merkkijonojen yhdistelmä ='%s ' n'',S1);
palata 0;
}

Tilannekuvia ohjelmasta ja tuotoksesta:

Teksti Kuvaus luodaan automaattisesti

Teksti Kuvaus luodaan automaattisesti

Ketjutus toimintojen avulla

Funktiota strconcatenate () kutsuu main () yhdistämään kaksi merkkijonoa.

Funktio saa merkkijonon1 pituuden käyttämällä merkkijonoa (merkkijono1).

Liitä merkkijonon 2 [i] elementit merkkijono1 [i+j]. Tämä vaihe toistetaan, kunnes merkkijono on tyhjä. Tässä yhteydessä merkkijono2 on merkkijono1 merkkijonon 1 lopussa.

Ketjutettu merkkijono (merkkijono 1) vastaanotetaan loppuun, kun kaikki silmukan iteraatiot suoritetaan.

Pää () tulostaa ketjutetun merkkijonon S1

#sisältää

#sisältää

#define BUF_SIZE 256

/ * -toiminto merkkijonon yhdistämisen toteuttamiseksi yllä olevan kuvauksen mukaisesti */
mitätönstrconcatenate(hiiltyä *merkkijono 1, hiiltyä*merkkijono2)
{
inti;
intj= strlen (merkkijono 1);
varten(i=0;merkkijono2[i];i++)
{
merkkijono 1[i+j]=merkkijono2[i];
}
merkkijono 1[i+j]= '' 0'';
}
inttärkein()
{
hiiltyämerkkijono 1[BUF_SIZE],merkkijono2[BUF_SIZE];
printf ('Kirjoita ensimmäinen merkkijono:'); / * Käyttäjän viesti ensimmäiselle merkkijonolle */
fgets (merkkijono 1,BUF_SIZE,stdin); / * Käyttäjän syöttämä toinen merkkijono, tallennettu merkkijonoon1 */
merkkijono 1[ strlen (merkkijono 1)-1] = '' 0'';

printf ('Kirjoita toinen merkkijono:'); / * Käyttäjän viesti toiselle merkkijonolle */
fgets (merkkijono2,BUF_SIZE,stdin); / * Käyttäjän syöttämä toinen merkkijono, tallennettu merkkijonoon2 */
merkkijono2[ strlen (merkkijono2)-1] = '' 0'';

strconcatenate(merkkijono 1,merkkijono2); /* Kutsu funktio argumentteina merkkijono1 ja merkkijono2*/

printf ('Tuloksena oleva merkkijono = %s' n'',merkkijono 1);
palata 0;
}

Tilannekuvia ohjelmasta ja tuotoksesta:

Teksti Kuvaus luodaan automaattisesti

Teksti Kuvaus luodaan automaattisesti

Merkkijonon ketjutus käyttämällä memcpy -ohjelmaa

Käyttämällä memcpy () -funktiota merkkijonon ketjutus tapahtuu kopioimalla sana sanalta yhdestä merkkipuskurista toisen merkkijonopuskurin loppuun, jossa sanan koko on 4 tavua, kun otetaan huomioon, että käytämme 32 -bittistä konetta, kun taas teemme merkkijonokytkentä käyttämällä merkkijonon yhdistämistä käyttämällä strcat () -funktiota, ketjutus tapahtuu kopioimalla tavu tavu yhdeltä merkkijonopuskurilta toiselle merkkijonopuskurille.

Tämä lähestymistapa on tehokasta.

Ainoa huomio käytettäessä memcpyä on huolehtia ' 0': sta.

C -ohjelma strcatin saavuttamiseksi muistilla:

#sisältää

#sisältää

#define BUF_SIZE 256

Mitätöi strcat_memcpy(hiiltyä *S1, hiiltyä *S2)
{
intpituus 1,pituus2;
pituus 1= strlen (S1);
pituus2= strlen (S2);
muisti (S1+pituus 1,S2,pituus2);
}
inttärkein()
{

hiiltyämerkkijono 1[BUF_SIZE],merkkijono2[BUF_SIZE];
printf ('Kirjoita ensimmäinen merkkijono:'); / * Käyttäjän viesti ensimmäiselle merkkijonolle */
fgets (merkkijono 1,BUF_SIZE,stdin); / * Käyttäjän syöttämä toinen merkkijono, tallennettu merkkijonoon1 */
merkkijono 1[ strlen (merkkijono 1)-1] = '' 0'';

printf ('Kirjoita toinen merkkijono:'); / * Käyttäjän viesti toiselle merkkijonolle */
fgets (merkkijono2,BUF_SIZE,stdin); / * Käyttäjän syöttämä toinen merkkijono, tallennettu merkkijonoon2 */
merkkijono2[ strlen (merkkijono2)-1] = '' 0'';

strcat_memcpy(merkkijono 1,merkkijono2); /* Kutsu funktio argumentteina merkkijono1 ja merkkijono2*/

printf ('Tuloksena oleva merkkijono = %s' n'',merkkijono 1);
palata 0;


}

Tilannekuvia ohjelmasta ja tuotoksesta:

Teksti Kuvaus luodaan automaattisesti

Teksti Kuvaus luodaan automaattisesti

Johtopäätös:

Kaiken tämän keskustelun avulla voimme päättää merkkijonon yhdistämisen C. Muistamme pääkohdat: On olemassa kaksi tapaa, joista toinen on C -standardi ja toinen on käyttäjän määrittämä tapa. Käyttäjän määrittämiä voi olla monenlaisia, riippuen siitä, miten käyttäjä haluaa toteuttaa merkkijonon yhdistämisen.