strlen, strcpy, strcat
Merkkijonojen ydinfunktionaalisuus.
strlen, strcpy, strcat on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.
Merkkijonot C-kielessä
C-kielessä merkkijono on yksinkertaisesti char-taulukko, joka päättyy erityiseen nollaterminaattorimerkkiin '\0'.
<string.h>-otsakkeen funktiot käyttävät tätä terminaattoria merkkijonon lopun löytämiseen. Ilman sitä ne lukevat taulukon lopun yli.
#include <stdio.h>
int main(void) {
char name[] = "Alice";
printf("%s\n", name);
printf("Bytes used: %lu\n", sizeof(name));
return 0;
}string.h-otsakkeen sisällyttäminen
Merkkijonofunktioiden käyttämiseksi otsake on sisällytettävä:
#include <string.h>
Tämä tuo käyttöön muun muassa funktiot strlen, strcpy, strcat ja strcmp.
#include <stdio.h>
#include <string.h>
int main(void) {
char greeting[] = "Hello";
printf("Length is %lu\n", strlen(greeting));
return 0;
}strlen: merkkien laskeminen
strlen palauttaa nollaterminaattoria edeltävien merkkien määrän. Se ei laske itse merkkiä '\0'.
Siksi strlen("cat") palauttaa arvon 3, vaikka taulukossa on 4 tavua.
#include <stdio.h>
#include <string.h>
int main(void) {
char word[] = "cat";
printf("strlen = %lu\n", strlen(word));
printf("sizeof = %lu\n", sizeof(word));
return 0;
}strlen on O(n)
Koska C-merkkijonot eivät tallenna pituutta, strlen-funktion täytyy käydä jokainen merkki läpi, kunnes se löytää merkin '\0'.
Siksi sen aikavaativuus on O(n). Välttäkää sen toistuvaa kutsumista suuren merkkijonon silmukan ehtolausekkeessa.
#include <stdio.h>
#include <string.h>
int main(void) {
char msg[] = "programming";
size_t len = strlen(msg);
for (size_t i = 0; i < len; i++) {
printf("%c", msg[i]);
}
printf("\n");
return 0;
}strcpy: merkkijonojen kopiointi
Merkkijonoja ei voi kopioida operaattorilla =. Käyttäkää funktiota strcpy(dest, src), joka kopioi src-merkkijonon kohteeseen dest, nollaterminaattori mukaan lukien.
Kohteen on oltava riittävän suuri lähteen ja terminaattorin säilyttämiseen.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("%s\n", dest);
return 0;
}strcpy-funktion puskuriylivuodon vaara
Jos dest on liian pieni, strcpy kirjoittaa puskurin ulkopuolelle ja korruptoi muistia. Tämä on yleinen tietoturvavirhe.
Suosikaa funktiota strncpy(dest, src, n), joka kopioi enintään n tavua. Huomioikaa, että strncpy ei välttämättä lisää nollaterminaattoria, jos src on liian pitkä.
#include <stdio.h>
#include <string.h>
int main(void) {
char src[] = "LongString";
char dest[5];
strncpy(dest, src, 4);
dest[4] = '\0';
printf("%s\n", dest);
return 0;
}strcat: merkkijonojen yhdistäminen
strcat(dest, src) liittää src-merkkijonon dest-merkkijonon loppuun. Se aloittaa kirjoittamisen dest-merkkijonon null-terminaattorin kohdalta ja lisää loppuun uuden null-terminaattorin.
dest-merkkijonon on oltava valmiiksi kelvollinen merkkijono, ja siinä on oltava riittävästi vapaata tilaa.
#include <stdio.h>
#include <string.h>
int main(void) {
char buffer[20] = "Hello, ";
strcat(buffer, "World");
printf("%s\n", buffer);
return 0;
}Merkkijonojen rakentaminen vaiheittain
Voitte ketjuttaa strcpy- ja strcat-kutsuja merkkijonon rakentamiseksi pala kerrallaan.
Aloittakaa aina alustetusta puskurista, jotta ensimmäinen strcat-kutsu löytää kelvollisen terminaattorin.
#include <stdio.h>
#include <string.h>
int main(void) {
char full[50];
strcpy(full, "Mr. ");
strcat(full, "John ");
strcat(full, "Smith");
printf("%s\n", full);
return 0;
}Turvallisempi yhdistäminen strncat-funktiolla
strncat(dest, src, n) liittää src-merkkijonosta enintään n merkkiä ja lisää sen jälkeen aina null-terminaattorin.
Tämä auttaa estämään puskurin ylivuodot, kun lähteen pituutta ei tunneta.
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[16] = "Data: ";
char src[] = "1234567890";
strncat(dest, src, 5);
printf("%s\n", dest);
return 0;
}Paluuarvot
Sekä strcpy että strcat palauttavat osoittimen kohteeseen dest. Tämän ansiosta kutsuja voi upottaa toistensa sisään, vaikka se voi heikentää luettavuutta.
strlen palauttaa tyypin size_t, joka on etumerkitön. Olkaa varovainen verratessanne sitä etumerkillisiin kokonaislukuihin.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[20] = "foo";
char b[] = "bar";
printf("%s\n", strcat(a, b));
return 0;
}Yleinen varausvirhe
Yleinen virhe on unohtaa null-terminaattoria varten tarvittava +1, kun puskurin kokoa lasketaan.
Jos merkkijonon pituus on n, tarvitsette n + 1 tavua. Kahden yhdistetyn merkkijonon kokonaispituus on strlen(a) + strlen(b) + 1.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abc";
char b[] = "de";
size_t needed = strlen(a) + strlen(b) + 1;
printf("Need %lu bytes\n", needed);
return 0;
}Pikatarkistus
Testatkaa, miten hyvin ymmärrätte merkkijonojen pituudet.
Kertaus
Opitte seuraavat string.h-kirjaston keskeiset funktiot:
- strlen laskee merkit ennen
'\0'-merkkiä (O(n)). - strcpy kopioi merkkijonon; kohteen on oltava riittävän suuri.
- strcat liittää tekstiä olemassa olevan merkkijonon loppuun.
- Varaa aina tilaa null-terminaattorille ja suosi turvallisuuden vuoksi
strn*-versioita.
Opi C tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 39
- Oppitunnit
- 144
Usein kysytyt kysymykset
Onko oppitunti ”strlen, strcpy, strcat” ilmainen?
Kyllä – oppitunnin ”strlen, strcpy, strcat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”strlen, strcpy, strcat”?
Merkkijonojen ydinfunktionaalisuus. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”strlen, strcpy, strcat”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?
Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- strlen, strcpy, strcat
- strcmp ja vertailu
- strtok ja tokenisointi
- memcpy ja memset