Text-DEBUG-Ausgabe als Bedingung (if-else) teilweise kopieren/übernehmen



  • Hallo,

    Ich habe eine Frage:

    im laufe meines Programms habe ich unter anderem folgendes stehen:

    cout << msg << endl;
    

    Wenn ich das Programm laufen lasse, dann bekomme ich bei der Ausführung in der "Konsole" folgendes ausgegeben:

    ms01-BE
    

    oder

    ms01-UGS
    

    oder ....

    Ich will im Code eine if-Abfrage nach dem Motto:

    if (*****BE) { tue dies }
    if (*****UGS) {tue das}

    d.h. ich will im Quellcode aus "msg" heraus es auslesen können UND ZWAR nur die stellen ab dem 6tem Zeichen.

    Hat jemand mal eine Idee wie ich es in C++ machen kann?

    Danke für die Hilfe im Voraus


  • Administrator

    Verwende eine der compare Überladungen:
    http://www.cplusplus.com/reference/string/string/compare/

    Grüssli



  • erstmal danke für die schnelle Antwort.

    D.h. ich kann in meinem Fall "msg" als ein String in compare-Funktion einfach so verwenden?

    als z.b.:

    if (msg.compare(6,3,"ugs") == 0)
    { tue etwas }



  • und noch was.

    Gibt es eine andere Möglichkeit (ohne Funktionen der stdlib) ?
    Gibt es da vielleicht einen Umweg?

    Wie kann ich im Quellcode direkt auf die cout Ausgabe von "msg" zugreifen, wenn es "intern" im Code nicht als ein anderer eigens Definierter Datentyp ist.


  • Administrator

    Nicht ganz, schau dir mal dieses Beispiel an:

    #include <string>
    #include <iostream>
    
    int main()
    {
    	std::string test1 = "hello world";
    	std::string test2 = "hello world!";
    
    	if(test1.compare(6, 5, "world") == 0)
    	{
    		std::cout << "test1 ends with world" << std::endl;
    	}
    
    	if(test2.compare(6, 5, "world") == 0)
    	{
    		std::cout << "test2 ends with world" << std::endl;
    	}
    
    	std::cin.get();
    
    	return 0;
    }
    

    Ausgabe:

    test1 ends with world
    test2 ends with world
    

    Grundsätzlich nicht korrekt. Daher verwende lieber std::string::npos als zweites Argument. So wird der ganze restliche String zum Vergleich hinzugezogen:

    #include <string>
    #include <iostream>
    
    int main()
    {
    	std::string test1 = "hello world";
    	std::string test2 = "hello world!";
    
    	if(test1.compare(6, std::string::npos, "world") == 0)
    	{
    		std::cout << "test1 ends with world" << std::endl;
    	}
    
    	if(test2.compare(6, std::string::npos, "world") == 0)
    	{
    		std::cout << "test2 ends with world" << std::endl;
    	}
    
    	std::cin.get();
    
    	return 0;
    }
    

    Ausgabe:

    test1 ends with world
    

    Grüssli



  • ich habe es eben ausprobiert :

    if (!msg.compare(5, 3, "UGS")) { tue etwas }
    

    und leider macht der compiler nicht mit 😞 ...

    Fehler: Abfrage des Elementes »compare« in »msg«, das vom Nicht-Klassentyp »Ieee802*« ist

    natürlich habe ich vorher

    #include <string>

    hinzugefügt

    Ich glaube hier brauche ich eine "andere" Möglichkeit, wenn es denn diese gibt 🙂 ... ein UMWEG 🙂


  • Administrator

    Oh, tut mir Leid. Da wir hier im C++ Forum sind, habe ich angenommen, dass msg vom Typ std::string ist. Aber dem scheint nicht der Fall zu sein. Was ist das für ein Typ? Aus welcher Bibliothek? Ieee802 ist jedenfalls kein Standard C++ Typ.

    Und was ist das für eine seltsame Fehlermeldung? Welchen Kompiler benutzt du?

    Grüssli



  • also der Typ ist zu speziell um es hier deutlich auszuführen.

    ich verwende schon den neuesten Compiler (arbeite unter Ubuntu)

    also gibt es keine Möglichkeit das ich im Quellcode direkt auf die "spätere" cout Ausgabe "in Text/String-Form" irgendwie dran kommen kann, ohne etwas includieren zu müssen bzw. stdlib zu verwenden?

    in jedem Fall, danke für die Hilfe!!!



  • Michi8080 schrieb:

    ich verwende schon den neuesten Compiler (arbeite unter Ubuntu)

    ubuntu ist ein compiler?

    also gibt es keine Möglichkeit das ich im Quellcode direkt auf die "spätere" cout Ausgabe "in Text/String-Form" irgendwie dran kommen kann, ohne etwas includieren zu müssen bzw. stdlib zu verwenden?

    äh? wie jetzt? wenn du den text per cout ausgibst, dann verwendest du doch schon die standardbibliothek?
    gib den string doch einfach deiner parser-funktion statt ihn auszugeben, dann musst du ihn nicht aus der ausgabe fischen.



  • also klar das ubuntu kein compiler ist.

    ich nutze : gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

    Also ich habe leider bis jetzt noch nie mit parser-funktionen gearbeitet 😞

    Also nochmal das Problem:

    ich habe einen "besonderen" Datentyp BLA. Ich habe ein "Objekt" von BLA der heißt "msg". "msg" wird intern im Programm unterschiedlich belegt "ms**-****"

    wenn ich

    cout << msg << endl;
    

    ausführe dann bekomme ich als Ausgabe im Programm z.B: "ms01-BE" raus.

    Was ich will:

    ich will das ich im Code IRGENDWIE an den Inhalt von "msg" drankomme und ab der 5ten-Stelle vergleichen kann, so das ich z.b. folgende if-Abfrage erstellen kann :

    if (msg = ms01-BE) {tue etwas}
    if (msg = ms01-UGS) {tue etwas anderes}
    

    wenn es eine Möglichkeit mit Parser-Funktionen gibt, könntest du mir vielleicht an einem einfachem Bsp. zeigen wie es geht???



  • void parse(string const & message)
    {
      // hier das rein was dravere vorgeschlagen hat
    }
    
    parse(msg); // vor jeder ausgabe dein parse() aufrufen
    cout << msg << endl;
    


  • also der Typ ist zu speziell um es hier deutlich auszuführen.

    dann wirste hier auch keine hilfe finden...
    entweder, du sagst uns, welchen typ du verwendest (zur not auch nen link) oder du sagst, wie die schnittstelle zu std::string bzw const char* ist...

    dann kannste so was machen:

    std::string tmp = deinstring.magic_c_str_fkt();
    
    //siehe draveres vorschlag...
    

    ich seh gerade, dass scho jmd ca. das selbe gesagt hat, aber naja... ^^

    bb


Anmelden zum Antworten