Paramter verarbeiten



  • Ich bin nach mehr als 20 Jahren C-Pause also blutiger Anfänger und versuche wieder einzusteigen in C++, nachdem ich UBUNTU kennengelernt habe und WINDOWS beerdigt habe. An der ersten Hürde kaue ich seit 2 Tagen.
    Wie übergebe ich numerische Parameter.

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    int main(int argn, char *argv[])
    {
    int x;
    string k;
    k=argv[1];
    //x = atoi(k); zunächst AUSGESCHALTET
    cout << "argn " << ":" << argn << endl;
    cout << "k " << ":" << k << endl;
    for(int j=0; j < argn; j=j+1)
    {
    cout << "argv " << ":" << argv[j] << endl;
    cout << "k " << ":" << k << endl;
    cout << "x " << ":" << x << endl;
    }
    }

    Ergebnis:

    ./CPROGS/BSP 5 70

    k :5
    x :-1218330636
    argn :3
    k :5
    argv :./CPROGS/BSP
    argv :5
    argv :70

    Ich will jedoch Parameter 1 (also 5) als int x verwenden, also x = atoi(k);
    Da streikt schon der Compiler:
    Speicherzugriffsfehler (Speicherabzug geschrieben)

    Was mach ich also falsch.



  • argv[1] ist ein char* und kein string
    atoi erwartet ein char* und keinen string

    x = atoi(argv[1]);
    


  • wer stürzt ab? Der Compiler oder dein Programm?

    Mit C++11 sollte es so gehen

    #include <string>
    ...
    std::string val = "5";// bei dir argv[1]
    int x = std::stoi( val );
    

    g++ --std=c++0x ...



  • Wenn man die C++11-Funktionen nicht verwenden will, dann kann man immernoch gut mit stringstreams arbeiten.

    #include <sstream>
    
    std::stringstream stream;
    stream<<argv[1];
    int zahl;
    stream>>zahl;
    

    EDIT: Auch wenn das nicht dein Problem ist: Dein Programm verlangt zur Zeit mindestens einen Parameter, der Fall dass nur einer angegeben wird, sollte unbedingt abgefangen werden, auch wenn da nur mit einer Fehlermeldung reagiert wird.



  • Ja oder man könnte auch einfach .c_str() hinten dran schreiben:

    x = atoi(k.c_str()); // tadaaa
    

    Warum der Compiler hier ohne .c_str() nen Schnellzug baut wäre aber auch interessant.

    ps: das Programm darf bei Ausführung natürlich crashen, denn es fehlt ja der argc check. Wenn man also keine Parameter mitgibt, dann kann es schonmal beim Zugriff auf argv[1] crashen, oder auch gerne im Konstruktor des std::string (dem man dummerweise keine Nullpointer übergeben darf).



  • hustbaer schrieb:

    x = atoi(k.c_str()); // tadaaa
    

    d.h. da würde dann stehen

    int main(int argn, char *argv[]) 
    { 
        std::stringstream stream;
        stream << argv[1];
        string k;
        stream >> k;
        int x = atoi(k.c_str());
        // ...
    }
    

    😃



  • Nein.
    Guckst du ersten Beitrag in diesem Thread.


Anmelden zum Antworten