char -> ASCII-Code



  • Hi.

    Ich möchte von einem char den ASCII-Code oder Unicode raus finden, wie mache ich das? Also kann ich den char in einen bestimmten Datentyp casten um den ASCII-Code zu bekommen?

    Und noch eine Frage, ich habe eine Funktion zum Vergleichen von Strings geschrieben und würde gerne wissen für wie (in)effizient ihr sie haltet.
    Und gibt das schon Methoden in irgendwelchen Headern, die vielleicht schneller sind? Ich denke zwar, dass ich mir hier nicht wirklich den Kopf über die Geschwindigkeit zuzerbrechen brauche, aber es soll ja immer alles möglichst effizient und schnell sein.

    bool compareString(char* string) {        
    
        char* value2 = string;
        char *p1, *p2;
        p1 = value2;
        p2 = value;
        bool same = false;
        while (p1[0] != '\0') {
            if (p1[0] == p2[0]) {
            same = true;
            p1++;
            p2++;
        } else {
            same = false;
            break;
        }
         }
         return same;
    }
    


    1. du mußt überhaupt nicht casten, char ist bereits ein numerischer Datentyp
    2. öhm ... normalerweise vergleicht man 2 Strings miteinander, deine tolle Funktion hat nur einen Parameter 🙂 das ist wahrscheinlich eine C++-Methode, die du mal einfach aus ihrer Klasse rausgerissen hast. Das C++-Forum ist nebenan.


  • Also das habe ich nicht aus einer Klasse gerissen. Die Variable "value" ist die klasseneigene Stringvariable die verglichen wird. Dass heißt ich habe meine eigene Stringklasse geschrieben.

    Frage zu char:

    könnte ich was in der Art von

    char token = 'a';
    token++;

    schreiben, um den nächsten ASCII-Wert zu erhalten?



  • Huch sorry, ich dachte das wär im ANSI-C Forum ... vergiß den Kommentar dazu.

    Die compareString-Funktion ist trotzdem ziemlich umständlich. Ich würd sie so schreiben:

    bool compareString(const char * string) const {
      const char *p = value;
      while (*p && *string && *p == *string) {
        ++p;
        ++string;
      }
      return *p == *string;
    }
    

    oder gleich so:

    #include <cstring>
    bool compareString(const char * string) const {
      return std::strcmp(string, value) == 0;
    }
    

    zur zweiten Frage: Jup. Sofern der Rechner mit ASCII arbeitet.



  • Also noch zwei Fragen:

    Könntest du mir bitte deinen code erklären?
    Also ich z.B. meinen Parameter string mit ++ inkrementieren wollte, wurde mir der Fehler "++ muss ein H-Wert sein" ausgegeben, aber egal ich will eigentlich nur deinen Code verstehen.

    2. Frage:

    Wenn ich einen Zeiger der auf einen String im Speicher zeigt, inkrementiere und ihn dann mit delete lösche, was passiert dann mit den vorigen bytes die ich übersprungen habe?



  • 1. Klar.

    // Funktion compareString bekommt einen Zeiger auf einen konstanten String, gibt 
    // bool zurück, und ändert ihr zugehöriges Objekt nicht (speziell this->value)
    bool compareString(const char * string) const {
      // temporäre Kopie des value-Zeigers, damit ich damit arbeiten kann
      const char *p = value;
      // brich ab, wenn entweder:
      while (*p          // der value-String zuende ist
             && *string  // der übergebene String zuende ist
             && *p == *string) { // keine Übereinstimmung mehr zwischen beiden Strings da ist
        // betrachte das jeweils folgende Zeichen
        ++p;
        ++string;
      }
      // mindestens einer der drei Gründe muß für den Abbruch der Schleife verantwortlich sein
      // wenn die Schleife aufgrund der Ungleichheit abgebrochen wurde, oder
      // weil ein String zuende war und der andere nicht, gib false zurück,
      // sonst true
      return *p == *string;
    }
    

    dass dir der Fehler "++ muß ein H-Wert sein" ausgegeben wurde, halte ich für frei erfunden. Vielleicht irgendwas mit L-Werten, aber dann lautet erstens die Fehlermeldung total anders und zweitens ist der Code dann auch total anders.

    2. Die Regel heißt: Du kannst nur Zeiger deleten, die du mit new erhalten hast. Wenn du auf einen solchen Zeiger irgendwas addierst, ist das schon nicht mehr der, den du von new erhalte hast, damit erzeugt das delete undefiniertes Verhalten. Sehr wahrscheinlich direkt einen Absturz.



  • Vielen Danke für die Antwort.
    Ich muss aber noch hinzufügen, dass diese Ausgabe nicht frei erfunden war!
    Mir wurde dieser Fehler ausgegeben, auch wenn ich nicht zutreffend gewesen sein sollte. 😛 😉


Anmelden zum Antworten