Inhalte zweier unterschiedlicher Klassen miteinander vergleichen (strcmp)



  • 314159265358979 schrieb:

    Ja.

    Und gleichzeitig hätte std::string mindestens fünf Probleme vermieden, die Rogi mit C-Strings noch haben wird.

    Eine Schleife, die im ersten Durchgang immer abbricht, ist auch äusserst sinnvoll. Genauso wie ein else if , das geradeso gut ein else sein könnte...



  • Hm, hier scheint man leider eher drauf aus zu sein auf Lehrmethoden anderer Leute rumzuhacken statt wirklich zu helfen...

    Danke trotzdem.



  • Und andernorts scheint man eher drauf aus zu sein, generelle Vorschläge kategorisch zu ignorieren und nur das zu hören, was man hören will.

    Tja, Sachen gibts...



  • Wie bereits oben geschrieben... Ich kann mit dem Hinweis leider nicht viel Anfang. Du warst auch mit meinem letzten Posting garnicht gemeint.

    Das Schleifenproblem habe ich behoben, aber ich habe noch immer keinen Zugriff auf die Tags die in der andere Klasse gespeichert sind.



  • Okay, dann war das ein Missverständnis.

    Der Grund, wieso du bisher vielleicht nicht allzu viele Antworten zu deinem eigentlichen Problem bekommen hast, besteht in der Ungenauigkeit deiner Problembeschreibung. Du redest von XML und Tags und sagst, dass es nicht funktioniert wie es sollte.

    Du teilst uns aber weder mit,

    • wie der Kontext deines Codebeispiels aussieht
    • was genau nicht funktioniert
    • was du überhaupt erreichen möchtest.

    Das wäre aber schon noch wichtig. Kannst du vielleicht auch einen Code posten, der dein Problem verdeutlicht, aber trotzdem so wenig Irrelevantes wie möglich enthält?



  • Okay. Dann versuche ich mal Problem mal zu konkretisieren:

    Ich habe eine DTD mit folgendem Inhalt aus der die Tags "person","vorname" und "famname" ausgelesen und in Objekten einer Klasse ClElement gespeichert werden.
    Anschliessend wird eine XML Datei geparsed die auch Tags enthält, welche allerdings in Objekten einer anderen Klasse (ClToken) gespeichert werden.

    Anschliessend sollen die Tags aus der XML Dtaie mit denen aus der DTD Datei vergleichen werden. Kommt ein Tag aus der XML Datei auch in der DTD vor, soll es als valide ausgezeichnet werden Kommt es in der DTD nicht vor, als invalide.

    Das soll in einer Schleife, ähnlich der oeben geposteten, passieren. Leider kriege ich jedoch keinen Zugriff auf die Tags aus der DTD Datei, da ich mich in einer Methode der Klasse der XML Datei befinde wenn dieses valide/invalide gecheckt werden soll.

    Ich hoffe so ist es deutlicher...
    Danke!



  • Warum man nicht direkt mit std::string anfängt? Weil man eventuell erstmal die Grundlagen von C lernt? Das lief bei uns genauso und das halte ich auch für die richtige Vorgehensweise.

    Den Cartoon von SeppJ finde ich dazu sehr passend. 😃

    Zum Thema: Wie liest du die DTD- bzw. XML-Datei denn erst ein?



  • RyoShinzo schrieb:

    Warum man nicht direkt mit std::string anfängt? Weil man eventuell erstmal die Grundlagen von C lernt? Das lief bei uns genauso und das halte ich auch für die richtige Vorgehensweise.

    C-Strings haben keinen Mehrwert und sind komplizierter in ihrer Verwendung. Warum also diese zuerst lernen?



  • Weil es wohl eher um allgemeine Programmierung geht als Sprachspezifische std::strings.



  • Das macht in der Form keinen Sinn. Entweder man lernt eine Sprache ordentlich, oder man lässt es bleiben.



  • HighLigerBiMBam schrieb:

    Weil es wohl eher um allgemeine Programmierung geht als Sprachspezifische std::strings.

    Das ist quasi das Antibeispiel gegen C-Strings. Wenn es um allgemeine Programmierung geht, dann sollte man sich auf die Logik konzentrieren können. In diesem Fall will man Strings darstellen. In C gibt es keine Strings. Es gibt nur Arrays aus Zeichen. Man muss recht genau wissen, wie diese zu behandeln sind (0-Terminierung, kopieren, vergleichen..., etc.). Mit einem std::string kann man so ganz allgemein Programmieren. Da ist ein String ein String, und benutzt sich, wie man es erwartet.



  • RyoShinzo schrieb:

    Zum Thema: Wie liest du die DTD- bzw. XML-Datei denn erst ein?

    Jeweils mit einer switch Anweisung

    Hier mal ein Codefetzen... Das is jetzt nur besagte switch Anweisung für die DTD

    ClElement *verarbeite(ifstream& datei)
    {
    char zeichen, letztes;
    char puffer[100];
    int zaehler;
    enum zustandDTD zustandDTD = noise;
    ClElement *jetzt = NULL, *wurzel, *neu;
    
    for (datei.get(zeichen);!datei.eof();datei.get(zeichen))
        {
        switch(zeichen)
           {
        case '<':
           zustandDTD=direktive;
           zaehler=0;
           break;
        case '>':
           if (zustandDTD!=noise)
              {
    	  if (letztes!=' ')
    	     {
                 puffer[zaehler]='\0';
    			 jetzt->addTag(puffer);
    	     }
    	  }
           zustandDTD=noise;
           break;
        case ' ':
           if (letztes==' ') continue;
           puffer[zaehler]='\0';
           zaehler=0;
           switch(zustandDTD)
              {
           case direktive:
              if (strcmp(puffer,"!ELEMENT"))
    	     {
    	     cout << endl << "Diese Direktive verstehe ich nicht: " << puffer;
    	     zustandDTD=noise;
    	     }
    	  else zustandDTD=element;
              break;
           case element:
    		  neu = new ClElement(puffer);
    		  if (jetzt!=NULL) jetzt->setNext(neu);
    		  else wurzel=neu;
    		  jetzt=neu;
    		  zustandDTD=abhaengig;
              break;
           case abhaengig:
    			 jetzt->addTag(puffer);
    			 break;
    	   }
    	   break;
        default:
           if (zustandDTD!=noise) puffer[zaehler] = zeichen;
           zaehler++;
           break;
           }
        letztes=zeichen;
        }
    return wurzel;
    }
    

Anmelden zum Antworten