Hvordan sammenligner jeg strengene korrekt?

Jeg forsøger at få et program til at lade en bruger indtaste et ord eller tegn, gemme det og derefter udskrive det, indtil brugeren skriver det igen og afslutter programmet. Min kode ser således ud:

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check); 
    }

    printf("Good bye!");

    return 0;
}

Problemet er, at jeg bliver ved med at få udskrivning af indtastningsstrengen, selv når brugerens indtastning (check) stemmer overens med den oprindelige (input). Sammenligner jeg de to forkert?

Løsning

Du kan ikke (med fordel) sammenligne strenge ved hjælp af != eller ==, du skal bruge strcmp:

while (strcmp(check,input) != 0)

Grunden til dette er, at != og == kun sammenligner basisadresserne for disse strenge. Ikke indholdet af selve strengene.

Kommentarer (5)

Ok, et par ting: Det er usikkert at bruge gets og bør erstattes med fgets(input, sizeof(input), stdin), så du ikke får et bufferoverløb.

Dernæst skal du bruge strcmp for at sammenligne strenge, hvor en returværdi på 0 indikerer at de to strenge passer sammen. Ved at bruge lighedsoperatorerne (dvs. !=) sammenlignes adressen på de to strenge, i modsætning til de enkelte kars i dem.

Bemærk også, at fgets gemmer også newline-tegnet '\n'\n' i bufferen, selv om det i dette eksempel ikke vil give problemer, hvilket gets() ikke gør. Hvis du sammenlignede brugerens input fra fgets() med en string literal som f.eks. "abc" ville det aldrig passe sammen (medmindre bufferen var for lille, så '\n' ikke ville få plads i den).

EDIT: og slået af den superhurtige Mysticial endnu en gang.

Kommentarer (4)

Du kan ikke sammenligne arrays direkte på denne måde

array1==array2

Du skal sammenligne dem karakter for karakter; til dette formål kan du bruge en funktion og returnere en boolsk værdi (Sand:1, Falsk:0). Derefter kan du bruge den i testbetingelsen i while-loop'en.

Prøv dette:

#include 
int checker(char input[],char check[]);
int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    scanf("%s",input);
    printf("I will now repeat this until you type it back to me.\n");
    scanf("%s",check);

    while (!checker(input,check))
    {
        printf("%s\n", input);
        scanf("%s",check);
    }

    printf("Good bye!");

    return 0;
}

int checker(char input[],char check[])
{
    int i,result=1;
    for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
        if(input[i] != check[i]) {
            result=0;
            break;
        }
    }
    return result;
}
Kommentarer (5)