Wie liest man “string” aus dem Befehlszeilenargument in C?

Lesezeit: 3 Minuten

Mikes Benutzeravatar
Mike

Ich habe eine Frage zum Übergeben von Parametern über die Befehlszeile.

Mein main() sieht aus wie

int main(int argc, char **argv){
  int b, d, n, flag;  
  char *init_d, tst_dir[100];

  argv++;
  init_d=*(argv++);
  //printf(); <--------What do I have to do to init_d so that I can print it later?

Wenn argv ist ein Zeiger auf ein Array von Zeigern, die ich zuweise init_d auf den Wert zeigen, auf den der Zeiger zeigt argv verweist auf? (Falls das überhaupt Sinn macht)

Ich nehme an, ich muss diesen Wert in ein Zeichen-Array bringen, um ihn auszudrucken, aber wenn ich die Größe der “Zeichenfolge”, die ich übergebe, nicht kenne, bin ich mir nicht sicher, wie ich das erreichen soll. Wenn ich zum Beispiel meinen Code ‘./myprogram hello’ im Vergleich zu ‘./myprogram Alonginput’ ausführe

  • Okay, danke an alle. Ich entschuldige mich für meine Dummheit. Ich bekam immer wieder Segmentierungsfehler, aber jetzt verstehe ich warum.

    – Mike

    18. Februar 2011 um 20:21 Uhr

Benutzeravatar von David Heffernan
David Heffernan

Sie können die Argumente drucken, ohne sie in Zeichenfelder zu übertragen. Sie sind nullterminierte C-Strings und printf isst sie zum Frühstück:

for (i=0; i<argc; i++)
  printf("%s\n", argv[i]);  

  • Nun, ich möchte die Argumente nicht sofort drucken, ich muss den in einer Variablen übergebenen Wert speichern, den ich später in einer Funktion drucken möchte

    – Mike

    18. Februar 2011 um 20:17 Uhr

  • @mike OK, rette sie. Das Betriebssystem weist den Speicherplatz für zu argv und da Ihr gesamtes Programm darin enthalten ist main und was auch immer es ruft, die Erinnerung wird für die Dauer gültig sein.

    – David Heffernan

    18. Februar 2011 um 20:18 Uhr


  • normalerweise würden wir drucken wollen argv[1] weiter als argv[0] heißt das Programm, wenn ich das Kerrigan-Buch gerade richtig gelesen habe.

    – mlSchüler33

    20. Dezember 2019 um 0:48 Uhr

Hier ist ein Beispiel, das Befehlszeilenargumente in eine einzelne Zeichenfolge konvertiert:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc < 1)
        return 0;

    int i;
    int strsize = 0;
    for (i=1; i<argc; i++) {
        strsize += strlen(argv[i]);
        if (argc > i+1)
            strsize++;
    }

    printf("strsize: %d\n", strsize);

    char *cmdstring;
    cmdstring = malloc(strsize);
    cmdstring[0] = '\0';

    for (i=1; i<argc; i++) {
        strcat(cmdstring, argv[i]);
        if (argc > i+1)
            strcat(cmdstring, " ");
    }

    printf("cmdstring: %s\n", cmdstring);

    return 0;
}

argv ist ein Zeiger auf ein Array von nullterminierten Strings. Sie müssen die Größe der Zeichenfolge nicht kennen; Alles, was Sie tun müssen, ist auf den Wert zu zeigen, da das Ende der Zeichenfolge mit einem ‘\0’ gekennzeichnet ist.

char* init_d = argv[0];
printf("%s", init_d);

Wenn Sie die Länge der Zeichenfolge wissen möchten, die Sie verwenden könnten strlen(argv[0]).

Benutzeravatar von Cratylus
Kratylos

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

    while(--argc>0)
       printf("%s\n",*++argv);
    return 0;
}

argc: argument count i.e. number of arguments in command line
argv: argument vector 

wenn Ihr Programm ist myProg dann myProg hello in der Befehlszeile hat argc=2 (einschließlich Programmname), argv[0] ist “myProg”, und argv[1] ist “Hallo”

Nach dem Rennen

init_d = *(argv++);

(parens nicht notwendig, btw), init_d ist ein Zeiger auf ein Zeichen. In C ist ein String ein Zeichenzeiger, der sich an den Vertrag hält, dass, wenn er weit genug vorgerückt wird, schließlich ein Nullzeichen (‘\0’) erreicht wird, das das Ende des Strings anzeigt. Mit anderen Worten, init_d ist jetzt genau der String, den Sie wollen. Sie können es mit drucken

printf("%s", init_d);

Beachten Sie übrigens, dass *argv++ Ihnen das erste Element von argv gibt, das eigentlich der Name der Funktion auf der Befehlszeile ist. Wahrscheinlich möchten Sie das erste Befehlszeilenargument, das Sie mit *++argv erhalten.

  • Du hast seines verpasst argv++; die den Befehlsnamen bereits überspringt.

    – Jim Balter

    18. Februar 2011 um 22:59 Uhr

Benutzeravatar von Fox32
Fuchs32

Sie können den String, auf den Sie mit init_d zeigen, mit ausgeben

printf("%s", init_d);

“%s” gibt alle Zeichen des Strings aus, bis ein ‘\0’ erreicht ist. In C sind Strings nullterminiert.

  • Du hast seines verpasst argv++; die den Befehlsnamen bereits überspringt.

    – Jim Balter

    18. Februar 2011 um 22:59 Uhr

1437490cookie-checkWie liest man “string” aus dem Befehlszeilenargument in C?

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

Privacy policy