string str = str2.at(2); -> Fehler



  • hallo

    ich hab folgende funktion:

    int str2int(string str)
    {
    	stringstream sstr;
    	sstr<<str;
    	int i;
    	sstr>>i;
    	return i;
    }
    

    diese funktion funktioniert auch z.B:

    int x = str2int("2");
    

    aber string.at(2) gibt char zurück statt string deswegen geht es leider nicht

    string zahl="12345";
    int x = str2int(zahl.at(2));
    //x sollte jetzt 3 sein
    

    das geht leider auch nicht:

    int x = static_cast<int>(zahl.at(2));
    //gibt 53 aus (ASCII-Code)
    //oder
    int x = str2int(zahl.at(2).c_str());
    //der compiler kann das c_str() nicht dem string zahl zuordnen sonst würde
    //es gehen
    

    hat jemand eine idee wie ich das problem beheben könnte?
    Danke



  • Hallo,

    Man könnte das z.Bsp. so machen

    int x = str2int(zahl.substr(2,1));
    

    Desweitern würde ich den Parameter in deiner Funktion anders übergeben (konstante Referenz statt Kopie).



  • Oder du überlädst einfach für char:

    inline std::string str2int (char c)
    {
        return str2int (std::string (&c));
    }
    

    Bin mir aber nicht sicher, ob das richtig ist, kompilieren und laufen tuts aber.



  • @.filmor:
    Der Name ist unglücklich gewählt, da nicht wirklich ein string zu nem int gemacht wird, und was soll das &-Zeichen bei der Übergabe an die eigentliche Funktion? Die erwartet keinen Pointer.



  • Das nicht. std::string hat aber keinen Konstruktor für char, wohl aber für char*. Das sollte so aber nicht funktionieren da so kein gültiger String an den Konstruktor übergeben wird.



  • Tuts aber ;). Übrigens habe nicht ich diesen Namen gewählt.



  • Tut es wirklich?
    Wenn du so aus einem char ein char* machst, sollte eigentlich das abschließende Nullbyte fehlen.



  • Schon klar, aber zumindest mit der Windows-Shell klappts. Bash dagegen gibt (wie es sich gehört) noch massig Müll aus.


  • Mod

    Braunstein schrieb:

    Tut es wirklich?
    Wenn du so aus einem char ein char* machst, sollte eigentlich das abschließende Nullbyte fehlen.

    kommt auf die ABI an. wenn wir von 32-bit x86 architektur ausgehen, dann ist jedes argument, dass über den stack übergeben wird, ohnehin 32bit aligned. es ist durchaus denkbar, dass kleinere argumente zunächst auf 32-bit zero/sign-extended werden anstatt irgendwelche reste, die noch im register vorhanden sind, zu verwenden. das hat nat. keine auswirkungen darauf, dass dieser code UB produziert.

    p.s. std::string hat zwar keinen konstruktor für char, dafür aber einen für char + std::size_t ...



  • .filmor schrieb:

    return str2int (std::string (&c));
    

    Ich würde dort eher "std::string(1,c)" übergeben, der char*-Konstruktor dürfte dir sonst irgendwelchen Datenmüll in deinen String reinpacken (eine char-Variable ist nicht Null-terminiert).


Anmelden zum Antworten