Wie bekomme ich argv[] als int?

Lesezeit: 7 Minuten

Michaels Benutzeravatar
Michael

Ich habe ein Stück Code wie folgt:

int main (int argc, char *argv[]) 
{
   printf("%d\t",(int)argv[1]);
   printf("%s\t",(int)argv[1]);
}

und in der Shell mache ich das:

./test 7

aber das erste printf-Ergebnis ist nicht 7, wie bekomme ich argv[] ein Heiliger? Danke schön

  • Ich weiß, cnicutar hat die Antwort bereits gegeben, aber es hilft zu verstehen, was vor sich geht. Wissen Sie, was argv[1] ist genau? Ich meine, können Sie erklären, warum Sie die Ausgabe erhalten, die Sie erhalten?

    – Herr Lister

    17. März 2012 um 8:25 Uhr

  • Meiner Meinung nach argv[0] ist Befehl selbst und argv[1] ist der erste Parameter, den ich eingebe. In diesem Fall ist 7.

    – Michael

    17. März 2012 um 13:27 Uhr

  • Ja, das stimmt, aber was ist das? Welche Art? Was kann man damit machen? Warum erhalten Sie die Ausgabe, die Sie im obigen Beispiel erhalten? Kann man damit addieren oder multiplizieren, und was ist, wenn der Benutzer keine Zahl eintippt, sondern ./test seven oder so?

    – Herr Lister

    17. März 2012 um 13:57 Uhr

Benutzeravatar von ouah
ouah

argv[1] ist ein Zeiger auf einen String.

Sie können die Zeichenfolge drucken, auf die es zeigt printf("%s\n", argv[1]);

Um eine Ganzzahl aus einem String zu erhalten, müssen Sie ihn zuerst konvertieren. Verwenden strtol um eine Zeichenkette in eine umzuwandeln int.

#include <stdio.h>
#include <errno.h>   // for errno
#include <limits.h>  // for INT_MAX, INT_MIN
#include <stdlib.h>  // for strtol


int main(int argc, char *argv[])
{
    char *p;
    int num;

    errno = 0;
    long conv = strtol(argv[1], &p, 10);

    // Check for errors: e.g., the string does not represent an integer
    // or the integer is larger than int
    if (errno != 0 || *p != '\0' || conv > INT_MAX || conv < INT_MIN) {
        // Put here the handling of the error, like exiting the program with
        // an error message
    } else {
        // No error
        num = conv;
        printf("%d\n", num);
    }
}

  • Danke vielmals. Ich verwende die strtol-Funktion und der Build war erfolgreich, aber ich habe ein EXC_BAD_ACCESS-Problem, ich denke, das liegt daran, dass argv[1] ist beim Projektbau nicht vorhanden.

    – Michael

    17. März 2012 um 13:41 Uhr

  • Was bedeutet die 10 in der strtol-Funktion?

    – Alejandro Sazo

    1. November 2013 um 4:43 Uhr

  • @AlejandroSazo ist die Basis der Konvertierung, also erfolgt die Konvertierung hier in der Basis 10.

    – au

    1. November 2013 um 8:49 Uhr

  • num = atoi(argv[1]) ist viel einfacher.

    – Bryan Grün

    17. September 2020 um 3:16 Uhr

  • @BryanGreen atoi() sollte niemals verwendet werden, da es unmöglich ist, mit einer solchen Funktion einen Fehler zu erkennen.

    – Marco Bonelli

    2. März 2021 um 17:04 Uhr

Benutzeravatar von Luc
Luc

Grundlegende Verwendung

Die “String zu lang” (strtol)-Funktion ist dafür Standard (“long” kann Zahlen enthalten, die viel größer als “int”) sind. So verwenden Sie es:

#include <stdlib.h>

long arg = strtol(argv[1], NULL, 10);
// string to long(string, endpointer, base)

Da wir das Dezimalsystem verwenden, ist die Basis 10. Die endpointer Argument wird auf das “erste ungültige Zeichen” gesetzt, dh die erste Nicht-Ziffer. Wenn es Ihnen egal ist, setzen Sie das Argument auf NULL anstatt wie gezeigt einen Zeiger zu übergeben.

Fehlerprüfung (1)

Wenn Sie nicht möchten, dass Nichtziffern auftreten, sollten Sie sicherstellen, dass es auf das “Null-Terminator” gesetzt ist, da a \0 ist immer das letzte Zeichen eines Strings in C:

#include <stdlib.h>

char* p;
long arg = strtol(argv[1], &p, 10);
if (*p != '\0') // an invalid character was found before the end of the string

Fehlerprüfung (2)

Als die Manpage erwähnt, können Sie verwenden errno um zu überprüfen, ob keine Fehler aufgetreten sind (in diesem Fall Überläufe oder Unterläufe).

#include <stdlib.h>
#include <errno.h>

char* p;
errno = 0; // not 'int errno', because the '#include' already defined it
long arg = strtol(argv[1], &p, 10);
if (*p != '\0' || errno != 0) {
    return 1; // In main(), returning non-zero means failure
}

// Everything went well, print it as 'long decimal'
printf("%ld", arg);

Fehlerprüfung (3)

Wie sigjuice betonte, ignoriert die Funktion gerne leere Zeichenfolgen und setzt sie nicht errno. Unsere Null-Byte-Prüfung wird auch nicht ausgelöst, weil eine Zeichenfolge der Länge Null ein a hat \0 gleich am Anfang. Wir brauchen also einen weiteren Import und eine weitere Prüfung:

#include <string.h>

if (strlen(argv[1]) == 0) {
    return 1; // empty string
}

In Ganzzahl umwandeln

Jetzt bleiben wir also dabei long, aber wir wollen oft mit ganzen Zahlen arbeiten. Um a umzuwandeln long In ein intsollten wir zuerst überprüfen, ob die Nummer innerhalb der begrenzten Kapazität von an liegt int. Dazu fügen wir eine zweite if-Anweisung hinzu, und wenn sie passt, können wir sie einfach umwandeln.

#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <string.h>

if (strlen(argv[1]) == 0) {
    return 1; // empty string
}
char* p;
errno = 0; // not 'int errno', because the '#include' already defined it
long arg = strtol(argv[1], &p, 10);
if (*p != '\0' || errno != 0) {
    return 1; // In main(), returning non-zero means failure
}

if (arg < INT_MIN || arg > INT_MAX) {
    return 1;
}
int arg_int = arg;

// Everything went well, print it as a regular number
printf("%d", arg_int);

Um zu sehen, was passiert, wenn Sie diese Prüfung nicht durchführen, testen Sie den Code ohne die INT_MIN/MAX if-Anweisung. Sie werden sehen, dass, wenn Sie eine Zahl größer als 2147483647 übergeben (231), wird es überlaufen und negativ werden. Oder wenn Sie eine Zahl kleiner als -2147483648 (-231-1), wird es unterlaufen und positiv werden. Werte jenseits dieser Grenzen sind zu groß, um in eine Ganzzahl zu passen.

Vollständiges Beispiel

#include <stdio.h>  // for printf()
#include <stdlib.h> // for strtol()
#include <errno.h>  // for errno
#include <limits.h> // for INT_MIN and INT_MAX
#include <string.h>  // for strlen

int main(int argc, char** argv) {
    if (strlen(argv[1]) == 0) {
        return 1; // empty string
    }
    char* p;
    errno = 0; // not 'int errno', because the '#include' already defined it
    long arg = strtol(argv[1], &p, 10);
    if (*p != '\0' || errno != 0) {
        return 1; // In main(), returning non-zero means failure
    }

    if (arg < INT_MIN || arg > INT_MAX) {
        return 1;
    }
    int arg_int = arg;

    // Everything went well, print it as a regular number plus a newline
    printf("Your value was: %d\n", arg_int);
    return 0;
}

In Bash können Sie dies testen mit:

cc code.c -o example  # Compile, output to 'example'
./example $((2**31-1))  # Run it
echo "exit status: $?"  # Show the return value, also called 'exit status'

Verwenden 2**31-1es sollte die Nummer und drucken 0weil 231-1 ist gerade in Reichweite. Wenn Sie bestehen 2**31 stattdessen (ohne -1), wird die Nummer nicht gedruckt und der Ausgangsstatus wird sein 1.

Darüber hinaus können Sie benutzerdefinierte Prüfungen implementieren: Testen Sie, ob der Benutzer überhaupt ein Argument übergeben hat (check argc), testen Sie, ob die Nummer im gewünschten Bereich liegt usw.

  • Besser erklärt als die akzeptierte Antwort. Zumindest für Anfänger wie mich.

    – Dinei

    22. April 2017 um 16:19 Uhr

  • ./example "" Your value was: 0

    – Sigissaft

    7. August 2021 um 22:00 Uhr


  • @sigjuice Guter Fang, ich denke, wir brauchen eine weitere Überprüfung auf Eingaben mit Nulllänge. Ist das der richtige Weg, damit umzugehen, oder ist etwas anderes falsch? (Sie würden denken, die strtol-Funktion würde nur errno setzen, wenn es, wissen Sie, einen Fehler gibt, aber andererseits dieser ist C immerhin…)

    – Luc

    9. August 2021 um 23:12 Uhr

  • #include <cstring> cstring ist eine C++-Bibliothek, die Zeichenfolgen im C-Stil bereitstellt. C-Bibliothek String-Bibliothek ist: #include <string.h>

    – M. Ruiz

    28. Januar um 8:53 Uhr


  • Danke @M.Ruiz! Ich habe die Antwort bearbeitet.

    – Luc

    28. Januar um 13:19 Uhr

Benutzeravatar von cnicutar
Cnicutar

Sie können verwenden strtol dafür:

long x;
if (argc < 2)
    /* handle error */

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

Wenn Sie C99 oder besser verwenden, können Sie alternativ erkunden strtoimax.

Sie können die Funktion verwenden int atoi (const char * str);.
Sie müssen einschließen #include <stdlib.h> und verwenden Sie die Funktion auf diese Weise:
int x = atoi(argv[1]);
Hier weitere Informationen bei Bedarf: atoi – C++-Referenz

/*

    Input from command line using atoi, and strtol 
*/

#include <stdio.h>//printf, scanf
#include <stdlib.h>//atoi, strtol 

//strtol - converts a string to a long int 
//atoi - converts string to an int 

int main(int argc, char *argv[]){

    char *p;//used in strtol 
    int i;//used in for loop

    long int longN = strtol( argv[1],&p, 10);
    printf("longN = %ld\n",longN);

    //cast (int) to strtol
    int N = (int) strtol( argv[1],&p, 10);
    printf("N = %d\n",N);

    int atoiN;
    for(i = 0; i < argc; i++)
    {
        //set atoiN equal to the users number in the command line 
        //The C library function int atoi(const char *str) converts the string argument str to an integer (type int).
        atoiN = atoi(argv[i]);
    }

    printf("atoiN = %d\n",atoiN);
    //-----------------------------------------------------//
    //Get string input from command line 
    char * charN;

    for(i = 0; i < argc; i++)
    {
        charN = argv[i];
    }

    printf("charN = %s\n", charN); 

}

Hoffe das hilft. Viel Glück!

1404040cookie-checkWie bekomme ich argv[] als int?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy