C - Comparaison de deux caractères
J'ai de la difficulté de la comparaison de deux caractères. J'ai écrit un très de base, C problème pour essayer arguments de ligne de commande.
Voici mon code pour l'instant:
#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 tapez ceci dans le terminal:
$ ./pet_shop -t dog -g f cute small
Je reçois ceci comme résultat:
You have chosen a dog:
Traits: cute small
La sortie du manque d'information sur le genre, elle doit être une fille depuis que je suis entré f. Mais j'ai essayé de vérifier par printf("%i", genre) qui a donné la valeur 0. Est g == 'f' la mauvaise manière de comparer les deux personnages?
Les définitions de
Activer les avertissements du compilateur (par exemple avec du CCG
Vous pouvez certainement affecter des choses à
ils ne le sont pas. Les littéraux de chaîne sont en lecture seule,
ch doit être déclarée comme
char *type = "";
sont en lecture seule c'est à dire vous ne pouvez pas affecter directement les chaînes de type
une fois que vous avez déclaré. Lisez ce - msdn.microsoft.com/en-us/library/8kc54dd5(v=vs. 80).aspxActiver les avertissements du compilateur (par exemple avec du CCG
-Wall
) et les erreurs de ce genre de les trouver facilement.Vous pouvez certainement affecter des choses à
type
. Vous ne pouvez pas écrire dans le pointu de la valeur, mais l'OP n'est pas de le faire.ils ne le sont pas. Les littéraux de chaîne sont en lecture seule,
char*
variables ne sont pas.ch doit être déclarée comme
int
, sinon EOF
manipulation peut ne pas être correct ion certaines plates-formes.
OriginalL'auteur tenkii | 2013-06-10
Vous devez vous connecter pour publier un commentaire.
gender
est unchar*
, c'est à dire un pointeur vers une chaîne de premier charadcter. Lorsque vous comparez cela à une seulechar
, à la fois lachar
et le pointeur se sont convertis en nombres entiers et un entier comparaison est faite.Pour comparer des chaînes, utilisez
strcmp
de<string.h>
:Notez les guillemets doubles (
"
), qui désigne une chaîne de caractères, plutôt que d'un seul caractère.il est beaucoup plus facile à écrire qu'à
gender[0] == 'f' && gender[1] == '\0'
. Il faudra probablement se inline lorsqu'il est utilisé avec une courte chaîne de caractères littérale et de la performance n'est pas vraiment essentiel dans ce programme.Cela ne fonctionne pas pour moi 🙁
OriginalL'auteur Fred Foo
Vous avez:
Donc
gender
est une chaîne de caractères, pas un personnage. Pour comparer des chaînes, utilisezstrcmp
.OriginalL'auteur Shahbaz
Vous d'abord déclaré le genre comme une chaîne de caractères:
Puis, plus tard, vous traitent comme un seul caractère:
Vous devez préciser dans votre propre esprit, ce qui
gender
est, avant d'essayer et de code.Chercher une définition, et rester avec elle.
OriginalL'auteur abelenky
Le problème, c'est que vous êtes la comparaison d'une chaîne de caractères (ou plutôt, un
char*
) à unchar
. Cette comparaison (c'est à direif(gender == 'f')
) permettra de comparer le pointeur brut valeur du caractère au lieu de comparer le contenu de la chaîne de caractères. Au lieu de cela, vous avez besoin de déréférencer le pointeur, puis de comparer cette valeur, ou de l'index dans la chaîne, c'est à direif(gender[0] == 'f')
.Bien sûr, il serait également une bonne idée de vérifier que la chaîne de caractères contient en fait quelque chose avant de tenter, pour éviter une erreur de segmentation.
gender
est une chaîne qui commence avec'f'
.OriginalL'auteur slugonamission