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

05.04.2011, 14:56

Konsolenanwendung die "Befehle" entgegen nimmt

Hallo,

mein erstes "Programm" indem ich einfach mal ausprobieren wollte wie was(das) geht ist eine Konsolenanwendung in der man etwas eintippt und daraufhin etwas passiert.
Also ähnlich wie cmd.exe.
Ich poste einfach mal meinen Code und würde mir freuen, wenn mal jemand ein Auge drauf wirft und mir Tipps gibt wie man was sinvoller macht.

Strings.cpp

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
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdlib.h>
#include "Funktionen.h"
#include <algorithm> 

using namespace std;

//Zerlegt einen String nach den Leerzeichen
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
    int iLeerzeichen;//Variable um die Leerzeichen die zählen und so das Array zu erzeugen
    string *pEingabe = NULL;//Zeiger auf das Array;

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


    //Array dynamisch erzeugen
    iLeerzeichen = count(sEingabe.begin(), sEingabe.end(), ' ')+1;
    pEingabe = new string[iLeerzeichen];


    //String zerlegen
    for (unsigned int i = 0 ; i < pEingabe.length() && j < 5; ++i)//Solange bis jede Position durchlaufen wurde
    {
        if (pEingabe[i] == ' ')//Wenn die aktuelle Position ein Leerzeichen ist
        {
            pEingabe[j] = pEingabe.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
            ++j;//Damit die Array Felder befüllt werden muss j steigen
        }
        else {}
    }
    pEingabe[j] = pEingabe.substr(z);

    //Funktionsaufruf des Menüs und Übergabe der einzelnen Teile
    Steuerung(aEingabe);
}


Funktionen.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>


using namespace std;

//Prototypen

//strings.cpp
void StringZerlegen ();

//Generelle Steuerung des Programms
void Steuerung(const string a[]);


Steuerung.cpp

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
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdlib.h>
#include "Funktionen.h"

using namespace std;

void Steuerung(const string a[])
{
    //Da Switch/case mit Strings nicht funktioniert.

    if (a[0]=="exit")
    {
        exit(0);
    }
    if (a[0]=="ping")//Damit was passiert. Testfunktion mittels dem System
    {
        string ip = a[1];
        system(("ping " + ip).c_str());//Ab hier nimmt das System mir alles ab
    }
    else {cout << "Befehl unbekannt\n";}

}


main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
#include "Funktionen.h"

using namespace std;

int main()
{
    do{
        StringZerlegen();
    }while(1!=2);
    return 0;
}


Dieser Code funktioniert Nicht!!!
Ich versuche gerade das Array was die einzelnen Befehlteile zerlegt dynamisch per new und einem Zeiger zu erzeugen. Davor habe ich es mit einem festen Wert von max. 5 Befehlsabschnitte probiert.
Leider kann ich dann nicht mehr so Dinge tun wie pEingabe.length() -> Warum nicht? Und wie kann ich das umgehen?


PS: Ja ich weiß system() ist nicht so das wahre.
Ich wollte auch nur ein wenig rumprobieren (:

lg
easyMaxi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

05.04.2011, 15:36

Dieser Code funktioniert Nicht!!!

Was genau funktionier nicht?

Davor habe ich es mit einem festen Wert von max. 5 Befehlsabschnitte probiert.
Leider kann ich dann nicht mehr so Dinge tun wie pEingabe.length() -> Warum nicht? Und wie kann ich das umgehen?

Wenn du ein Array aus strings hast musst du eben auf einen dieser strings zugreifen. Also z.B. pEingabe[2].length()!?

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

3

05.04.2011, 15:46

C-/C++-Quelltext

1
Steuerung(aEingabe);

Was ist denn dieses aEingabe? Wo kommt das denn her?

4

05.04.2011, 16:53

Zitat

Was ist denn dieses aEingabe? Wo kommt das denn her?
Oh tschuldigung, da habe ich vergessen das a durch ein p zu ersetzen, denn vorher wurde das Array weitergegeben was ja jetzt mit dem Zeiger repräsentiert wird.

Zitat

Wenn du ein Array aus strings hast musst du eben auf einen dieser strings zugreifen. Also z.B. pEingabe[2].length()!?
Mist wieder ein dummer Fehler.
Jetzt weiß ich wie ich das mache danke! :D Aber mein problem war das ich eigentlich die Länge des Strings haben wollte(also die Eingabe).

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
38
39
40
41
42
43
44
45
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdlib.h>
#include "Funktionen.h"
#include <algorithm> 

using namespace std;

//Zerlegt einen String nach den Leerzeichen
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
    int iLeerzeichen;//Variable um die Leerzeichen die zählen und so das Array zu erzeugen
    string aEingabe[4];//Array mit 5 Felder, um den String zu zerlegen.
    string *pEingabe = NULL;//Zeiger auf das Array;

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


    //Array dynamisch erzeugen
    iLeerzeichen = count(sEingabe.begin(), sEingabe.end(), ' ')+1;
    pEingabe = new string[iLeerzeichen];


    //String zerlegen
    for (unsigned int i = 0 ; i < sEingabe.length() && j < 5; ++i)//Solange bis jede Position durchlaufen wurde
    {
        if (sEingabe[i] == ' ')//Wenn die aktuelle Position ein Leerzeichen ist
        {
            pEingabe[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
            ++j;//Damit die Array Felder befüllt werden muss j steigen
        }
        else {}
    }
    pEingabe[j] = sEingabe.substr(z);

    //Funktionsaufruf des Menüs und Übergabe der einzelnen Teile
    Steuerung(pEingabe);
}


So jetzt funktioniert es (:

EDIT: Achja und habe das j < 5 entfernt, da ja jetzt beliebig viele Teile vorkommen dürfen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »easyMaxi« (05.04.2011, 17:11)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

05.04.2011, 18:13

Vergiss nicht dass du alles was du mit new[] erzeugst auch selbst wieder mit delete[] freigeben muss.

6

05.04.2011, 20:17

Ah super danke!
Das hätte ich jetzt glatt vergessen ...

Werbeanzeige