C - Vergleich von zwei Zeichen
Ich habe Probleme beim Vergleich von zwei Zeichen. Ich habe geschrieben, eine sehr einfache C-problem zu versuchen, Befehl Linie Argumente.
Hier ist mein code bisher:
#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;
}
So, wenn ich geben Sie dies in die Klemme:
$ ./pet_shop -t dog -g f cute small
Bekomm ich dies als Ausgabe:
You have chosen a dog:
Traits: cute small
Die Ausgabe es fehlen Informationen über das Geschlecht, es sollte ein Mädchen sein, da ich f eingegeben. Aber ich habe versucht, die Kontrolle durch printf("%i", gender) gab, die den Wert 0. Ist g == 'f' die falsche Art von Vergleich von zwei Zeichen?
- Definitionen wie
char *type = "";
sind schreibgeschützt, d.h. Sie können nicht direkt zuordnen Saitentype
Sie haben einmal erklärt. Habe einen Lesevorgang durch diese - msdn.microsoft.com/en-us/library/8kc54dd5(v=vs. 80).aspx - Biegen Sie auf compiler-Warnungen (z.B. mit GCC
-Wall
) und Fehler wie diese können leicht gefunden werden. - Sie können sicher zuordnen, Dinge zu
type
. Sie können nicht schreiben, in der Spitzen-Wert, aber OP ist nicht zu tun. - das gilt auch für eine
char *const
. char * ptr = ""
sind immer noch Lesen, nur in C 🙂 @interjay ja, sorry,optarg
ist ein Zeiger hier richtig?- Sie sind es nicht. String-Literale sind nur-lese -
char*
Variablen nicht. - Ich meine, dass ein
char*
variable neu zugewiesen werden, um irgendwo anders, und das ist das, was der OP tut. Die Zeichenfolgen sollten nicht und werden nicht geändert durch die gebuchten Programm. - okay, ich dachte du meintest, dass das nur-lese-segment könnte geändert werden, durch einen 'char *'. Ich hob es auf, weil meine Annahme, dass die OP soll mit
char* type
in ähnlicher Weise, wie ein Zeichen-array. Dann erst später stellte ich fest, dass optarg ist ein Zeiger, so ist alles gut. - ch sollte erklärt werden, wie
int
, sonstEOF
Handhabung nicht richtig sein könnte-Ionen einigen Plattformen. - Eigentlich
getopt
nicht zurückEOF
es gibt-1
. (Gleicher Wert, unterschiedliche Konzepte.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
gender
ist einchar*
, d.h. einen Zeiger auf einen string die ersten charadcter. Wenn Sie vergleichen, die zu einem einzigenchar
sowohl diechar
und die Zeiger sind in Ganzzahlen konvertiert und ein integer-Vergleich erfolgt.Strings vergleichen, verwenden Sie
strcmp
aus<string.h>
:Hinweis: die doppelten Anführungszeichen (
"
) das bedeutet, dass eine Zeichenfolge, sondern als ein einzelnes Zeichen.gender[0] == 'f' && gender[1] == '\0'
. Es wird wahrscheinlich inlined, wenn verwendet, mit einem kurzen string-literal und die Leistung ist nicht wirklich wichtig in diesem Programm.Haben Sie:
So
gender
ist ein string, kein Charakter. Um Zeichenketten miteinander zu vergleichen, verwenden Siestrcmp
.Sie zuerst deklariert Geschlecht als string:
Dann später behandeln ist als ein einzelnes Zeichen:
Klären Sie in Ihrem eigenen Geist, was
gender
ist, bevor Sie versuchen und code.Wählen Sie eine definition, und-stick mit it.
Das problem ist, dass Sie Vergleich einen string (oder besser gesagt, eine
char*
) zu einemchar
. Dieser Vergleich (D. H.if(gender == 'f')
) vergleichen Sie die raw-Zeiger-Wert, um das Zeichen anstelle des Vergleichs der Inhalt der Zeichenfolge, um den Charakter. Stattdessen müssen Sie zu dereferenzieren Sie die Zeiger-und dann vergleichen Sie das Wert oder den index in der Zeichenkette, d.h.if(gender[0] == 'f')
.Natürlich wäre es auch eine gute Idee zu überprüfen, dass der string tatsächlich enthält etwas, bevor Sie versuchen, dass, um zu vermeiden, einen segfault.
gender
ist eine beliebige Zeichenfolge, die beginnt mit'f'
.