2010-11-21 20 views
4

Ich habe diesen Code:Kann argv nicht vergleichen?

if (argv[i] == "-n") 
{ 
    wait = atoi(argv[i + 1]); 
} 
else 
{ 
    printf("bad argument '%s'\n",argv[i]); 
    exit(0); 
} 

Wenn dieser Code ausgeführt wird ich die folgende Fehlermeldung erhalten:

bad argument '-n'

ich nicht ernst, warum es das tut. Kann jemand das erklären?

Antwort

14

Stringvergleiche benötigen eine Funktion in C - normalerweise strcmp() von <string.h>.

if (strcmp(argv[i], "-n") == 0) 
{ 
    wait = atoi(argv[i + 1]); 
} 
else 
{ 
    printf("bad argument '%s'\n",argv[i]); 
    exit(0); 
} 

strcmp() Die Funktion gibt einen negativen Wert (nicht notwendigerweise -1), wenn das erste Argument Sortierungen vor dem zweiten; ein positiver Wert (nicht notwendigerweise +1), wenn die ersten Argumente nach der zweiten sortieren; und Null, wenn die zwei Werte gleich sind.

1

Der Operator == funktioniert nicht auf den Inhalt von Zeichenfolgen, da Zeichenfolgen effektiv Zeichenzeiger in dieser Anwendung sind, und die Zeiger verglichen werden.

Um den Inhalt von Strings zu vergleichen, verwenden Sie strcmp oder strncmp.

0

Sie vergleichen Zeiger (argv[i] und von "-n" sind ein char* und ein const char*).

Verwenden Sie stattdessen strcmp().

0

Was Sie hier wirklich tun, ist Zeigervergleich. argv [i] ist keine Zeichenfolge, sondern ein Zeiger auf eine Stelle im Speicher, an der die eigentliche Zeichenfolge beginnt. Verwenden Sie strcmp().

0

Sie vergleichen Zeiger, nicht String-Inhalt. argv[i] und "-n" sind zwei verschiedene Zeichenfolgen, die an zwei verschiedenen Speicherorten gespeichert sind, auch wenn die Zeichen in den Zeichenfolgen gleich sind.

0

In C wird der Operator == auf Gleichheit verglichen.

Werte des gleichen numerischen Typs werden direkt verglichen (d. H. 2 + 2 == 4 ist wahr).

Werte von verschiedenen ganzzahligen (und nicht ganzzahligen numerischen) Typen unterliegen einer gewissen Umwandlung. Siehe woanders.

Zeiger sind gleich, wenn der Punkt an der gleichen Adresse ist.

Zeichenfolgenliterale werden im Speicher abgelegt und überschneiden sich nicht mit anderen Dingen; Einschließlich Überlappung von nichts, auf das argv [i] zeigt (für i = 0 bis argc).

Sie vergleichen also zwei ungleiche Zeiger; deshalb. Sie möchten if (!strcmp(argv[i], "-n")) { ... } verwenden.

0
int equal(char* stringa, char* stringb) { 
    while((*stringa) && (*stringb)) { 
     if(*stringa!=*stringb) 
      return FALSE; 
     stringa++; 
     stringb++; 
    } 
    return TRUE; 
} 

arbeitet auch für mich