web-dev-qa-db-fra.com

C - Comparaison de deux caractères

J'ai du mal à comparer deux personnages. J'ai écrit un problème C très basique pour essayer des arguments de ligne de commande.

Voici mon code jusqu'à présent:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char ch;
    char *type = "";
    char *gender = "";
    int baby = 0;
    int count = 0;

    /* Options:
     * -t = type of pet
     * -g = gender
     * -b = baby or adult
     */
    while ((ch = getopt(argc, argv, "t:g:b")) != EOF)
        switch (ch) {
            case 't':
                type = optarg;
                break;
            case 'g':
                gender = optarg;
                break;
            case 'b':
                baby = 1;
                break;
            default:
                fprintf(stderr, "Invalid option.\n");
                return 1;
        }

    argc -= optind;
    argv += optind;

    printf("You have chosen a %s.\n", type);
    if (gender == 'f')
        puts("It's a girl");
    if (gender == 'b')
        puts("It's a boy.");

    // The main command line arguments should be about the traits of the pet
    printf("%s", "Traits: ");
    for (count = 0; count < argc; count++)
        printf("%s ", argv[count]);

    return 0;
}

Donc, si je tape ceci dans le terminal:

  $ ./pet_shop -t dog -g f cute small

Je reçois ceci en sortie:

  You have chosen a dog:
  Traits: cute small

En sortie il manque des informations sur le sexe, ça devrait être une fille depuis que je suis entré f. Mais j'ai essayé de vérifier par printf ("% i", gender) qui a donné la valeur 0. g == 'f' est-il une manière incorrecte de comparer deux caractères?

8
tenkii

gender est un char*, c'est-à-dire un pointeur vers le premier charadcteur d'une chaîne. Lorsque vous comparez cela à un seul char, le char et le pointeur sont convertis en nombres entiers et une comparaison entière est effectuée.

Pour comparer des chaînes, utilisez strcmp de <string.h>:

if (strcmp(gender, "f") == 0)
    // it's a girl

Notez la citation double (") qui signifie une chaîne plutôt qu'un seul caractère.

16
Fred Foo

Tu as:

char *gender = "";

Donc gender est une chaîne, pas un caractère. Pour comparer des chaînes, utilisez strcmp .

4
Shahbaz

Vous avez d'abord déclaré le sexe sous forme de chaîne:

char *gender = "";

Ensuite, vous traitez plus tard comme un seul caractère:

if(gender == 'f')
   [...]
if(gender == 'b')

Vous devez clarifier dans votre esprit ce qu'est gender, avant d'essayer de le coder.
Choisissez une définition et respectez-la.

4
abelenky

Le problème est que vous comparez une chaîne (ou plutôt un char*) À un char. Cette comparaison (c'est-à-dire if(gender == 'f')) comparera la valeur brute du pointeur au caractère au lieu de comparer le contenu de la chaîne au caractère. Au lieu de cela, vous devez déréférencer le pointeur, puis comparer cette valeur ou l'index dans la chaîne, c'est-à-dire if(gender[0] == 'f').

Bien sûr, ce serait également une bonne idée de vérifier que la chaîne contient réellement quelque chose avant de tenter cela afin d'éviter une erreur de segmentation.

3
slugonamission