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?
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.
Tu as:
char *gender = "";
Donc gender
est une chaîne, pas un caractère. Pour comparer des chaînes, utilisez strcmp
.
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.
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.