Announcement

Collapse
No announcement yet.

Char-Vergleich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Char-Vergleich

    Hallo,

    ich habe diesmal ein bestimmt sehr einfaches Problem: Ich möchte gern 2 Strings miteinander vergleichen. Aber mein Programm sagt immer, der String wäre nicht gleich. In buff steht aber definitiv **. Aus der Variablen text wird das herauskopiert, - dort steht z.B. **13:15:20.

    Kann mit jemand erklären, warum der Vergleich nicht hinhaut? Es eilt. Danke.

    void Datenauswertung(byte dev, char text[])
    {
    char buff[3];

    memcpy (buff, text, 2);

    if (buff=="dd")
    {
    Zeige_Text(0, buff);
    }
    else
    {
    Zeige_Text(0, "KEINE ÜBEREINSTIMMUNG MIT dd");
    }
    }

  • #2
    Hallo.
    Ich nehme mal an, das Du nur die ersten (Zeichen 0 und Zeichen 1) beiden mit einander vergleichen willst.

    Probiere es mal so. memcpy(&buff[0],&text[0],2).

    Sollte funktioniere

    Comment


    • #3
      Mit

      buff=="dd"

      wird KEIN Vergleich der Stringinhalte durchgeführt, sondern bestenfalls der Zeiger.

      Ein Vergleich ist mit == nicht möglich.

      Dafür gibt es Funktionen

      strcmp

      strcmp
      Christian

      Comment


      • #4
        Hallo,

        ich danke Dir für Deine Antwort. Das habe ich bereits so getan. Aber: Geht es denn nciht mit == irgendwie?

        MfG
        Sebastia

        Comment


        • #5
          strcmp & strcmpi liefern -1, 0 oder 1

          zurück

          Von der Methode Strings mit == zu vergleichen ist abzurate
          Christian

          Comment


          • #6
            Hallo,

            hier vergleicht der C-Compiler sicherlich die Adressen der Variablen (Pointer) miteinander. Die sind natürlich immer unterschiedlich. Einfache Char-Buffer müssen mit strcmp bzw. strncmp verglichen werden.

            if ( strncmp( Text, "dd", 2 ) == 0 ) -> Strings sind gleich

            Gruß Ud

            Comment


            • #7
              Hallo,

              DU WARST SCHNELLER. Mit hatte jemd geantwortet, aber die wieder gelöscht.

              Ich danke Dir für Deine Antwort. Das habe ich bereits so getan. Aber: Geht es denn nciht mit == irgendwie?

              MfG Sebastia

              Comment


              • #8
                Mit == geht es nur wenn man Stringklassen verwendet, bei denen der ==-Operator entsprechend überladen ist.

                Gruß Ud

                Comment


                • #9
                  Recht herzlichen Dank, Udo.

                  Sebastia

                  Comment


                  • #10
                    Is' zwar schon ne Weile her dieser Thread, aber bevor ich ein neues Thema erstelle, knüpf ich nochmal an.

                    Bei mir schlägt der Vergleich immer fehl. Ich versuche den Standarddrucker mit einem Druckernamen aus einer String-Liste zu vergleichen, um diesen zu markieren.
                    Sicherlich habe ich da einen Gedankenfehler Deshalb hoffe ich, daß mir einer helfen kann?
                    Die Funktion sieht folgendermaßen aus:
                    Code:
                    void _listPrinters() {
                    	char *StdPrn;
                    	unsigned long StdPrnBuffer;
                    	int str_len;
                    
                    	Printer()->PrinterIndex = -1;
                    	Form1->DruckerListe->Clear();
                    
                    	GetDefaultPrinter(StdPrn,&StdPrnBuffer);
                    
                    	for(int x=0; x<Printer()->Printers->Count; x++) {
                    		Form1->DruckerListe->Items->Add(Printer()->Printers->Strings[x]);
                    		if(strcmp(Printer()->Printers->Strings[x].c_str(),StdPrn) == 0)
                    			Form1->DruckerListe->ItemIndex = x;
                    	}
                    }
                    Das klappt soweit alles wunderbar. Die Liste wird auch mit sämtlichen im System installierten Druckern gefüllt.
                    Jedoch wird nicht der Standarddrucker automatisch markiert.

                    In StdPrn steht ein String, der zumindest optisch exakt dem aus der Liste entspricht (habe ich mit ShowMessage() anzeigen lassen).

                    Was ist dann an dieser Abfrage falsch?

                    Vielen Dank
                    Arne

                    (habs übrigens auch in zwei schleifen getestet, also erst liste gefüllt, dann nochmal durchlaufen und verglichen)
                    Zuletzt editiert von Arne Drews; 27.06.2008, 09:33.
                    PHP rocks!
                    Eine Initiative der PHP Community

                    Comment


                    • #11
                      Was steht in StdPrn drin?
                      Was steht in Printer()->Printers->Strings[x] jeweils drin?

                      Solche Fehler kann man mit debuggen prima finden.

                      Des Weiteren

                      GetDefaultPrinter(StdPrn,&StdPrnBuffer);

                      Du belegst StdPrbBuffer nicht somit könnte es sein,das in StdPrn nix drin steht
                      pcchBuffer [in/out] On input, specifies the size, in characters, of the pszBuffer buffer. On output, receives the size, in characters, of the printer name string, including the terminating null character.
                      Weiterhin kannst du jedes char welche eine Funktion erzeugt mit

                      String mydrucker=StdPrn

                      in einen C++Builder String umwandeln und dann mit

                      Printer()->Printers->Strings[x] == mydrucker

                      vergleichen. Das rumfummeln mit strcmp u.a. entfällt dann
                      Christian

                      Comment


                      • #12
                        In StdPrn steht der Name des Standarddruckers, habe ich wie gesagt mit ShowMessage() geprüft. Mittlerweile funktioniert es auch, wie oben beschrieben.
                        Ich habe allerdings keine Ahnung warum, weil ich an dem Code nichts verändert habe.
                        Jetzt bekomme ich jedoch beim Schließen(!) meiner Anwendung eine Exception "Zugriffsverletzung" in Kernel32.dll!!!

                        Ik ward verrüggd...
                        PHP rocks!
                        Eine Initiative der PHP Community

                        Comment


                        • #13
                          Jetzt bekomme ich jedoch beim Schließen(!) meiner Anwendung eine Exception "Zugriffsverletzung" in Kernel32.dll!!!
                          Du belegst StdPrbBuffer nicht
                          char *StdPrn

                          An diese Adresse wrd irgendwas geschrieben... ohne das der Zeiger mit Speicher belegt wäre
                          Christian

                          Comment


                          • #14
                            Ja klar, Du hast Recht!

                            Ich muß nicht
                            Code:
                            char *StdPrn;
                            sondern z.B.
                            Code:
                            char StdPrn[1024];
                            und
                            Code:
                            GetDefaultPrinter(StdPrn,&StdPrnBuffer);
                            anstelle der "Zeiger"-Variante mit *StdPrn verwenden. Dann gehts reibungslos.

                            Ich sag' ja... Irgendwo hab' ich einen Gedankenfehler.
                            Danke für den Hinweis!
                            PHP rocks!
                            Eine Initiative der PHP Community

                            Comment


                            • #15
                              Wenn du dann auch noch StdPrnBuffer
                              auf 1024 setzt....
                              Christian

                              Comment

                              Working...
                              X