C Academy · Oppitunti

strlen, strcpy, strcat

Merkkijonojen ydinfunktionaalisuus.

Oppitunti 1/413 vaihetta

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.
Aloita maksutta

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

  1. strlen, strcpy, strcat
  2. strcmp ja vertailu
  3. strtok ja tokenisointi
  4. memcpy ja memset
← Takaisin: C Academy