Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.03.2011, 15:32

Strings nach Leerzeichen zerlegen und in ein Array speichern

Hallo,

ich versuche so etwas zu programmieren wie eine Konsole.
Also es gibt bestimmte Befehle und auf die hin passiert etwas.
Ich möchte nun das es auch möglich sein soll Parameter an die Befehele zu hängen.
Also z.b. könnte so eine Zeichenkette so aussehen: help german easy(Sinn jetzt mal dahingestellt)
Dann soll er erkennen ok er will Hilfe und dann soll bei Hilfe geschaut werden was mit german angefangen werden kann usw.
Ich hab mir überlegt wie das am sinvollsten gehen kann.
Meine letzte Überlegung war es mit switch/case zu probieren.

Ganz unabhängig davon wie es am Ende ausgewertet wird möchte ich das die Zeichenkette erst einmal zerlegt wird.
Also soll daraus:
help
german
easy gemacht werden. Jeweils z.b. in ein Arrayfeld

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>

using namespace std;

int main()
{
    //Variabeln deklarieren
    string sEingabe; 


    getline(cin,sEingabe); //Eingabe des Nutzers abfragen
    cout << sEingabe << "\n" ; //Eingabe zur Sicherheit ausgeben
    cout << sEingabe.length() << "\n" ; //Länge des Strings ausgeben

    //String zerlegen
    int j = 0;//Feldnummer des Arrays
    int z = 0;//Zwischenvariable, um den Anfang des Wortes zu markieren
    string aEingabe[4];//5 Felder maximal
    for (unsigned int i = 0 ; i < sEingabe.length(); ++i)//Solange bis jede Position durchlaufen wurde
    {
        if (sEingabe[i] == ' ')//Wenn die aktuelle Position ein Leerzeichen ist
        {
            cout << "Es ist ein Leerzeichen \n";
            cout << z << " ist z \n" ;
            cout << i << " ist i \n" ;
            aEingabe[j] = sEingabe.substr(z,i);//Schneide von z bis i ab und speichere das Wort
            z = i+1;//z ist jetzt die Stelle hinter dem letzten Leerzeichen
            cout << z << " ist z nachher\n" ;
            cout << aEingabe[j] << " ist das Arrayfeld \n" ;
            ++j;//Damit die Array Felder befüllt werden muss j steigen
        }
        else {cout << "Es ist kein Leerzeichen \n";}
    }

    return 0;
}


Leider funktioniert das nicht so wie ich es gerne hätte.
Dabei verstehe ich leider noch nicht so genau warum.

Sieht einer den Fehler?

lg
easyMaxi

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »easyMaxi« (31.03.2011, 15:46)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

31.03.2011, 17:13

was passiert denn genau?
du solltest vielleicht "&& j < 4" als schleifenbedingung hinzufügen. sonst fällt mir nichts auf.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

31.03.2011, 18:56

Ich kann das was die Konsole ausspuckt leider nicht kopieren.
Vll. kann es ja mal einer ausprobieren.
Am besten mit folgendem String: test teste testet testest. Hier wird auffallen, das das erste Wort noch sauber rausgeschnitten wird. Danach werden aber irgendwie immer 2 rausgenommen.
Auch wird das Wort an sich irgendwie abgeschnitten.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

4

31.03.2011, 19:38

http://www.cplusplus.com/reference/string/string/substr/


Parameters
pos
Position of a character in the current string object to be used as starting character for the substring.
If the position passed is past the end of the string, an out_of_range exception is thrown.
n
Length of the substring.
If this value would make the substring to span past the end of the current string content, only those characters until the end of the string are used.
npos is a static member constant value with the greatest possible value for an element of type size_t, therefore, when this value is used, all the characters between pos and the end of the string are used as the initialization substring.

der Zweite Parameter ist die Länge des Substrings ;)
New Project: Operation CityRacer

5

31.03.2011, 19:52

Verdammt, danke :D
Wie bekomme ich denn dann die Länge raus?

C-/C++-Quelltext

1
2
temp = i-temp;
            aEingabe[j] = sEingabe.substr(z,temp);


War mein erster Ansatz, da die Länge ja die aktuelle Position(Länge) ist minus das was als letztes weggeschnitten wurde.
Am Anfang ist temp 0.
Aber auch hier scheint sich ein Denkfehler eigneschlichen zu haben.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

6

31.03.2011, 19:56

bei deinem Programm einfach: aEingabe[j] = sEingabe.substr(z,i-z);
New Project: Operation CityRacer

7

31.03.2011, 19:59

oh klar.
Danke!

Jetzt denke ich mir noch etwas aus um den letzten Teil abzufange.
Ich denke einfach nachdem ich aus der Schleife bin

C-/C++-Quelltext

1
aEingabe[j] = sEingabe.substr(z,Länge des Strings);


Wenn ich das richtig verstanden habe wird trotzdem nur bis zum Ende das ganze gemacht und es dann abgeschnitten.


Fall es wen interesiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void StringZerlegen()
{
    //Variabeln deklarieren
    string sEingabe; //String der zerlegt werden soll
    int j = 0;//Feldnummer des Arrays
    int z = 0;//Zwischenvariable, um den Anfang des Wortes zu markieren
    string aEingabe[4];//Array mit 5 Felder, um den String zu zerlegen.

    //String einlesen
    getline(cin,sEingabe); //Eingabe des Nutzers abfragen


    //String zerlegen
    for (unsigned int i = 0 ; i < sEingabe.length() && j < 4; ++i)//Solange bis jede Position durchlaufen wurde
    {
        if (sEingabe[i] == ' ')//Wenn die aktuelle Position ein Leerzeichen ist
        {
            aEingabe[j] = sEingabe.substr(z,i-z);//Schneide von z ab und speichere das Wort mit der Länge i
            z = i+1;//z ist jetzt die Stelle hinter dem letzten Leerzeichen
            cout << aEingabe[j] << " ist das Arrayfeld "<<j << "\n"  ;
            ++j;//Damit die Array Felder befüllt werden muss j steigen
        }
        else {}
    }
    cout << z;
    aEingabe[j] = sEingabe.substr(z);
    cout << aEingabe[j] << " ist das Arrayfeld "<<j << "\n" ;

}

Meine "Lösung".
Einziges bekanntest wirkliches Problem ist, wenn man mehr als 4 Wörter eingibt.
Noch keine gescheite Idee wie ich das löse.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »easyMaxi« (31.03.2011, 21:52)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

31.03.2011, 20:31

Stichwort std::vector.

9

31.03.2011, 20:47

Kommen erst sehr weit hinten im Buch (:
Also werde ich wohl noch ein wenig lesen müssen bevor ich das vollenden kann.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

31.03.2011, 20:53

die bedingung j < 5 ist falsch. j < 4 wär richtig
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige