2016-11-10 3 views
1

Ich führe mein Programm mit einigen Befehlszeilenargumenten aus. Aber wenn ich 10 eingeben, 10, 10 und drucken sie aus, er druckt 49 aus, 49, 49. Hier ist mein Code:Drucken von Integern aus Befehlszeilenargumenten in C

int main(int argc, char *argv[]) { 
    int seed = *argv[0]; 
    int arraySize = *argv[1]; 
    int maxSize = *argv[2]; 

Warum ist das passiert ??

Antwort

1

Nun, argv ist ein Array von Zeiger auf Zeichenfolgen. Alle Befehlszeilenargumente werden als Zeichenfolgen übergeben und der Zeiger auf jeden von ihnen wird von argv[n] gehalten, wobei die Sequenz für das Argument n+1 ist.

Für eine gehostete Umgebung unter Angabe C11, Kapitel §5.1.2.2.1

Wenn der Wert von argc größer als Null ist, wird die Zeichenfolge zu von argv[0] zeigte stellt die Programmnamen; argv[0][0] soll das Nullzeichen sein, wenn der Programmname in der Hostumgebung nicht verfügbar ist. Wenn der Wert argc größer als eins ist, repräsentieren die Strings, auf die argv[1] bis argv[argc-1] zeigt, die Programmparameter.

Also, klar, für eine Ausführung wie

./123 10 10 10 // 123 ist der binäre Name

  • argv[0] ist nicht das erste „Befehlszeilenargument an das Programm übergeben ". Es ist argv[1].
  • *argv[1] gibt nicht den Wert int zurück, den Sie als Befehlszeilenargument übergeben haben.

    Grundsätzlich *argv[1] gibt man den Wert des ersten Elements des Zeichenfolge (dh ein char Wert von '1'), die meisten möglicherweise in ASCII kodierten Wert (die man Plattform verwendet), ansd gemäß der ascii table a '1' hat die dezimal va; lue von 49, die Sie sehen.

Lösung: Sie müssen

  • prüfen die Anzahl der Argumente (argc)
  • Schleife über jedes Argument Zeichenfolge argv[1] ~ argv[n-1] während argc == n
  • jedes der Eingangs Konvertieren Zeichenfolge zu int (für diesen Fall können Sie strtol() verwenden)
1

Dereferenzierung einen String (*argv[x]) gibt Ihnen einen char (den Wert des ersten Zeichens in der Zeichenkette), in diesem Fall ist der Wert ASCII '1': dezimal 49

Sie können diese Strings umwandeln (ohne dereferencing) mit strtol

int arraySize = (int)strtol(argv[1], NULL, 10); 

Wie dem auch sei argv[0] wird der Name des Programms, sind Sie sicher, dass der Programmname mit 1 beginnt?

Verwandte Themen