Struct string an int übergeben, wie?



  • Hallo zusammen,

    ich möchte Passwörter generieren, die Parameter lese ich aus 5 Inputdateien aus und speichere jeweils die "Einstellungen" in dem struct. Pro Zeile nur einen Parameter, die erste Zeile ist z.B. : "Länge des Passworts: 14", als Trennzeichen habe ich ":" gewählt und bei ja/nein Eingaben das Leerzeichen dazwischen einfach in dem späteren Vergleich für true/false der Variablen übernommen. Es werden anschließend die erstellten Passwörter der ersten inputdatei in eine outputdatei geschrieben und mit einer for-Schleife, mit Hochzählen des inputnamens, für die nächsten 4 wiederholt. Ohne Leerzeichen vor der Zahl klappte das Programm tadellos.

    Mit meiner untenstehenden Lösung gibt er mir den Fehler beim Ausführen des Programmes aus: string subcript out of range

    Ich habe bereits über ChatGPT und andere C++-Erklär-Seiten versucht Befehle zum Umwandeln zu verwenden, aktuell klappt es sehr unbeständig. Mal kommt die Fehlermeldung beim 4. Input, mal beim 2., Manchmal läuft es auch komplett durch. Wenn ich mit dem Debugger schrittweise durch die Stelle gehe klappt es häufiger komplett nur manchmal tritt dann der Fehler auf.

     if (inputFile.is_open()) {
                    string line;
                    EingabeStruct eingabe;
    
                    while (getline(inputFile, line)) {
                        size_t found = line.find(":");
                        if (found != string::npos) {
                            string value = line.substr(found + 1);
                            eingabe.werte.push_back(value);
                            if (eingabe.werte.size() == 7)
                                break;
                        }
                    }
    
                    inputFile.close();
    
                    if (!eingabe.werte.empty() && eingabe.werte.size() > 0) {
    
                        string konvert = eingabe.werte[0];
                        konvert.erase(std::remove_if(konvert.begin(), konvert.end(), ::isspace), konvert.end());  // Entfernen der Leerzeichen
    
                        cout << konvert;
    
                        length = stoi(konvert);  // Umwandeln von string in int
    
                    }
    

    Gibt es eine verlässlichere Lösung die Zahl nach dem ": " der Variable length zuzuweisen?

    Vielen Dank für eure Hilfe!

    Lolli_13



  • @Lolli_13 Mir fallen gerade 2 Dinge auf. Du gehst davon aus, das, wenn ein ":" gefunden wird es auch eine Stelle danach gibt. Wenn es die nicht gibt, fliegt dir das um die Ohren.

    Und !eingabe.werte.empty() && eingabe.werte.size() > 0 ist irgendwie gedoppelt.



  • @Schlangenmensch Ja, das stimmt. Die Dateien sind aber alle so geschrieben, dass danach immer eine Text/Zahl kommt. Fehlermeldungen für den Anwender bei falschem Input sind vorhanden, habe ich hier nicht aufgeführt.

    Die Doppelung ist tatsächlich etwas überflüssig. Danke für den Hinweis!

    Der Fehler könnte natürlich auch im Rest des Programms stecken. Was bedeutet den die Fehlermeldung -string subcript out of range- ?



  • @Lolli_13 Das bedeutet, dass du auf eine Position in einem String zugreifen willst, die es nicht gibt.

    Normalerweise bekommt man aber ein paar Informationen mehr. Häufig zeigt dir der Debugger auch an, an welcher Stelle die Exception geflogen ist.

    Ein wichtiger Hinweis um hier gute Antworten zu bekommen: Versuch dein Beispiel so stark zu reduzieren, dass es, wenn irgendwie möglich, kompilierbar ist und man damit den Fehler nachstellen kann.



  • es ist kompilierbar, zeigt keine Fehler an und lässt das programm arbeiten. über cout habe ich ja die Ausgabe eingebunden um eine grobe Richtung zu bekommen in welchem durchlauf es hängt. mal steht da nur 10 wenn der Fehler kommt, dann 101214 von 3 input dateien danach kommt der Fehler. der Fehler kommt nicht immer an der gleichen stelle, obwohl ich die gleichen inputs verwende. Das macht es sogar mit dem debugger schwierig



  • @Lolli_13 Es geht um das, was du hier im Forum zeigst. Und das ist kein vollständiges Programm.

    Beim Microsoft Compiler ist "String subscript out of range" ist eine Debug Assertion. Wenn die ausgelöst wird, kommt eine Fehlermeldung die Abschließt mit "Press Rety to debug the application". Wenn man dann auf Retry klickt, sieht man, wo die Assertion ausgelöst wird und kann durch den Callstack gehen und genau sehen, wo der Fehler her kommt.



  • @Schlangenmensch Ich dachte man soll hier nicht den ganzen Programmcode schreiben 😕 Danke für den Hinweis, werde ich ausprobieren!



  • @Lolli_13 sagte in Struct string an int übergeben, wie?:

    Ich dachte man soll hier nicht den ganzen Programmcode schreiben

    Wo hast du das denn her? Man soll möglichst ein SSCCE posten, das den Fehler zeigt. Aber, wenn das nicht möglich ist, dann das ganze Programm + Compilerflags resp. Übersetzungsanweisungen.



  • @Lolli_13 Du sollst das Problem so eingrenzen, dass du ein lauffähiges Programm zeigen kannst, welches das Problem reproduziert und dabei möglichst minimal ist.

    Wenn du Code postest, das Problem aber wo anders liegt, verschwenden wir Zeit darauf, da einen Fehler zu suchen, der vlt gar nicht da ist.



  • Um das weiter zu ergänzen: das ist dann auch gleich ein Schritt in Richtung "Test":

    #include ...
    
    void test_config_parser() {
       stringstream input_data("pwlen: 14\nsettingX: 5\nsetting Y: 3\n");
       EingabeStruct es = parse_configuration(input_data);
       EXPECT_EQ(14, es.password_length);
       EXPECT_EQ(5, es.setting_x);
       // usw.
    }
    

    Das ganze in einem Test-Framework deiner Wahl (dazu musst du ggf. den Namen der Funktion anpassen und/oder die EXPECT_EQ ersetzen).


Anmelden zum Antworten