C++ Funktion um Text in Binärcode zu übersetzen gibt unerwartete Rückgabewerte.



  • Außerdem mischst du strings und c-strings (nullterminierte chararrays). Die Prüfung auf nicht-null in der Schleife ist falsch, es muss in etwa so aussehen:

    for(int i = 0; i < text.size(); ++i)
    {
        // mach was mit text[i]
    }
    


  • 01001 ist eine Oktalzahl.

    weil mit 0 beginnend, bei C++14 geht auch 0b01001



  • Hallo Hyde++,

    Hyde++ schrieb:

    Außerdem mischst du strings und c-strings (nullterminierte chararrays). Die Prüfung auf nicht-null in der Schleife ist falsch, es muss in etwa so aussehen:

    for(int i = 0; i < text.size(); ++i)
    {
        // mach was mit text[i]
    }
    

    Also das dieser Code sicherlich schöner aussieht ja, aber warum ist es falsch in C++ auf eine Null-Terminierung zu prüfen?

    int main() {
      std::string s("hello");  
      bool r = s[s.size()] == '\0'; // True
      bool ptr = &s[0] == s.c_str(); // True
      return 0;
    }
    

    Soweit ich das bei der STL von MS VS 2013 sehe, ist der Datenpointer von '&string.at(0)' und 'string.c_str()' identisch.

    Viele Grüße

    Jakob



  • Es ist nicht richtig falsch aber std::string kann auch Strings mit Null Terminator drin speichern. Wenn man also nur bis zum ersten Null Terminator ließt hat man eventuell nicht den ganzen String verarbeitet.



  • So wie es im Ursprungspost steht ist es richtig falsch, da auf einen Index ausserhalb des gültigen Wertebereichs zugegriffen wird.



  • manni66 schrieb:

    So wie es im Ursprungspost steht ist es richtig falsch, da auf einen Index ausserhalb des gültigen Wertebereichs zugegriffen wird.

    Wo? Der operator[] erlaubt auch den Zugriff auf den Null Terminator.



  • Aber nicht auf den Index size(), denn sonst würde at() ja auch damit funktionieren

    string s("Test");
    cout << s.at(s.size()) << '\n'; // <- out_of_range exception
    

    Code auf ideone



  • Th69 schrieb:

    Aber nicht auf den Index size(), denn sonst würde at() ja auch damit funktionieren

    string s("Test");
    cout << s.at(s.size()) << '\n'; // <- out_of_range exception
    

    Code auf ideone

    In der STL gibt es ein Unterschied ob der operator[] oder die Methode .at() aufgerufen wird.

    operator[] - Keine Überprüfung ob der Index gültig ist -> siehe: http://ideone.com/Q079pU
    at() - Überprüft den Index -> Exception, wie bei Deinem Code nachgewiesen.



  • Der Unterschied zwichen operator[] und .at() ist mir schon klar. Manni66 bezieht sich allerdings auf den Ursprungspost wo es kein .at() gibt.



  • sebi707 schrieb:

    manni66 schrieb:

    So wie es im Ursprungspost steht ist es richtig falsch, da auf einen Index ausserhalb des gültigen Wertebereichs zugegriffen wird.

    Wo? Der operator[] erlaubt auch den Zugriff auf den Null Terminator.

    Wenn es C++ 11 ist, ja. Sonst nur für die const Version, die hier nicht benutzt werden dürfte.

    Ob der gcc das in der "alten" libstd für C++ 11 schon richtig implementiert?



  • manni66 schrieb:

    Ob der gcc das in der "alten" libstd für C++ 11 schon richtig implementiert?

    Ja gut. Ich dachte C++11 kann man mittlerweile voraus setzen. Der ältere Standard garantiert zwar nichts aber mich würde schon extremst wundern wenn irgendeine Standardlibrary da jemals irgendwas komisches gemacht hat. Der Null Terminator muss dort ja eh stehen für den operator[]() const .



  • manni66 schrieb:

    Wenn es C++ 11 ist, ja. Sonst nur für die const Version, die hier nicht benutzt werden dürfte.

    Ernsthaft jetzt, bei der const Version war das erlaubt? Ich dachte immer auf den Null-Terminator kann man sich nur verlassen wenn man .c_str() verwendet, und sonst genau nirgends.



  • hustbaer schrieb:

    Ernsthaft jetzt, bei der const Version war das erlaubt? Ich dachte immer auf den Null-Terminator kann man sich nur verlassen wenn man .c_str() verwendet, und sonst genau nirgends.

    Hat mich auch gewundert als ich letztens zu std::string was im Standard nachgeschlagen hab. Noch was eventuell Neues für dich wenn du nur bei c_str an den Nullterminator glaubtest: Die data Memberfunktion liefert genau das gleiche wie c_str ! Im Standard gibts nichtmal eine separate Beschreibung für beide...



  • Mh OK das scheint immerhin erst seit C++11 so zu sein...



  • Ja, das mit data ist ne C++11 Sache, und die war mir schon bekannt. Ich beziehe mich auf C++98 bzw. 03.



  • Okay danke jetzt weiß ich schonmal ungefähr was ich tun sollte, wenn ich soweit bin, werde ich versuchen das mit einem Algorithmus zu lösen. Ich danke euch auf jeden Fall für eure Antworten.

    Ps: Wenn ich z. B. auf dieser Website Text in Binärcode übersetzen lassen will, kommt doch auch eine Null als erste Zahl ?

    Mit freundlichem Gruß 😉



  • Tha_Coralis schrieb:

    Ps: Wenn ich z. B. auf dieser Website Text in Binärcode übersetzen lassen will, kommt doch auch eine Null als erste Zahl ?

    Hat irgendwer behauptet, in Binärzahlen dürfen keine führende Nullen vorkommen?



  • in C/C++

    123 = dezimal
    0x123 = hexadezimal
    0124 = oktal (wird an der fuehrenden 0 erkannt)
    0b01100 = binär (0b... ab C++14 verfuegbar)



  • Im übrigen sind Zahlen die mit 0 beginnen keine binären Zahlen sondern Zahlen zur Basis 8! Daher kriegst du auch wohl deine komische Ausgabe.

    Wenn ich das richtig verstanden habe.



  • Tha_Coralis schrieb:

    Im übrigen sind Zahlen die mit 0 beginnen keine binären Zahlen sondern Zahlen zur Basis 8! Daher kriegst du auch wohl deine komische Ausgabe.

    Wenn ich das richtig verstanden habe.

    Aus deinen Äußerungen lässt sich schließen, dass du nicht wirklich verstanden hat, worum es geht. Aber ja, eine Zahl, die im C++-Quellcode steht (number literal) und mit einer 0 beginnt, ist eine Oktalzahl.


Anmelden zum Antworten