C-keel strcmp funktsioon: Stringide võrdlemine ja kasutusnäited

C-keeles stringide võrdlemisel, mida sina kasutad? strcmp on funktsioon, mis kontrollib, kas kaks stringi on samad – justkui küsiks programmilt: „Kas need kaks on samad?“ Muidugi ei suuda programm otsustada, kas kassid või koerad on armsamad, aga vähemalt suudab ta eristada „HELLO“ ja „hello“ erinevust. Selles artiklis selgitame strcmp funktsiooni tööpõhimõtet, kasutusviisi ja levinumaid vigu.

1. Mis on strcmp funktsioon?

strcmp funktsioon võrdleb kahte stringi märkhaaval ja tagastab tulemuse täisarvuna. Funktsioon töötab järgmiselt:

  • 0: kui stringid on identsed
  • Positiivne väärtus: kui esimene string on sõnastikulises järjekorras pärast teist
  • Negatiivne väärtus: kui esimene string on sõnastikulises järjekorras enne teist

See funktsioon võimaldab mitte ainult kontrollida, kas stringid on samad, vaid ka määrata, kumb neist on eespool. Programmis saab seda kasutada järgmiselt:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "World";

    int result = strcmp(str1, str2);
    printf("strcmp tulemuseks on: %d\n", result);
    return 0;
}

Ülaltoodud kood võrdleb “Hello” ja “World” ning kuvab tulemuse. Tähtis on märkida, et strcmp eristab suuri ja väikseid tähti, seega „HELLO“ ja „hello“ loetakse erinevateks stringideks.

2. Kuidas strcmp funktsioon töötab?

strcmp tööpõhimõte on lihtne, kuid võimas. See võrdleb kahte stringi alustades esimesest märgist, märkhaaval, ning tagastab erinevuse niipea, kui leitakse erinevad märgid. Seda loogikat kasutatakse ka tähestikulise järjestuse määramiseks. Näiteks kui võrrelda “apple” ja “banana”, võrdleb strcmp esmalt “a” ja “b”, ning tagastab negatiivse väärtuse.

Allpool on näide programmist, mis aitab strcmp toimimist paremini mõista:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("Stringid on identsed.\n");
    } else if (result < 0) {
        printf("str1 tuleb enne str2.\n");
    } else {
        printf("str1 tuleb pärast str2.\n");
    }

    return 0;
}

See kood võrdleb stringe “apple” ja “banana”. Tulemuseks näitab strcmp, et “apple” tuleb sõnastikus enne “banana”. See funktsioon on väga kasulik näiteks stringide tähestikulises järjekorras sorteerimisel.

3. strcmp funktsiooni kasutusnäited

1. Kasutaja sisendi kontrollimine

strcmp on kasulik, kui soovid võrrelda kasutaja sisestatud andmeid olemasolevate andmetega. Näiteks saab seda kasutada parooli vastavuse kontrollimiseks.

#include <stdio.h>
#include <string.h>

int main() {
    char password[] = "secret";
    char input[256];

    printf("Sisesta parool: ");
    scanf("%s", input);

    if (strcmp(password, input) == 0) {
        printf("Parool sobib.\n");
    } else {
        printf("Parool on vale.\n");
    }

    return 0;
}

See programm võrdleb sisestatud parooli ja õiget parooli strcmp abil.

2. Sõnastikulise järjekorra määramine

Ka stringide tähestikulise sortimise puhul on strcmp väga kasulik. Kui sul on mitu sõna, saad strcmp abil kindlaks teha, kumb neist peaks tulema eespool.

4. strcmp funktsiooni alternatiivid

strcmp on väga kasulik, kuid mõnel juhul võib olla mõistlik kaaluda ka teisi funktsioone, sõltuvalt kasutusotstarbest.

strncmp: osalise stringi võrdlemine

strncmp kasutatakse siis, kui soovid võrrelda ainult osa stringist. Näiteks saab võrrelda vaid esimese kolme tähe ulatuses.

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "apricot";

    if (strncmp(str1, str2, 3) == 0) {
        printf("Esimesed 3 tähte ühtivad.\n");
    } else {
        printf("Esimesed 3 tähte ei ühti.\n");
    }

    return 0;
}

memcmp: mälu võrdlemine

memcmp on funktsioon, mida kasutatakse mitte ainult stringide, vaid üldiselt mäluplokkide võrdlemiseks. See on eriti kasulik, kui on vaja võrrelda binaarandmeid.

5. Levinumad vead

1. Suurte ja väikeste tähtede erinevuse eiramine

strcmp eristab suuri ja väikeseid tähti. Näiteks käsitleb ta “HELLO” ja “hello” kui erinevaid stringe. Kui vajad võrdlust, mis ei sõltu tähesuurusest, tasub kaaluda strcasecmp kasutamist.

2. NULL-viidete võrdlemine

Kui strcmp funktsioonile antakse NULL-viide, võib programm kokku joosta (crash). On väga oluline kontrollida, kas võrreldavad stringid on korralikult initsialiseeritud ja mitte tühjad (NULL).

Kokkuvõte

strcmp on väga oluline funktsioon C-keeles, mis võimaldab lihtsalt stringe võrrelda. Artiklis tutvustasime selle kasutamist parooli kontrollimisel ja stringide sorteerimisel ning tõime välja reaalseid näiteid. Kui tegeled stringide töötlusega programmis, tasub kindlasti strcmp võimalusi ise järele proovida.