Testen ob ein String binär ist



  • Deine Abfrage if ((*number)[i] == '1' || '2') ist logisch falsch (genauer gesagt ergibt sie immer true ;- ).
    Du mußt die beiden Werte einzeln vergleichen (und mit ||verknüpfen):

    char c = (*number)[i];
    if (c == '1' || c == '2')
      return true;
    

    Außerdem ist deine else-Verzweigung logisch falsch. Überprüfe mal die Compiler-Warnungen (bzw. stelle sie an/höher)!

    PS: Warum übergibst du den String number als Zeiger???
    PPS: Formatiere deinen Code hier in Code-Tags!!!



  • @Johnny01

    @DocShoe sagte in Testen ob ein String binär ist:

    Du musst den Vergleich ausformulieren: if( *(number)[i] == '1' || *(number)[i] == '2').

    Sinnvollerweise prüft man auch auf die richtigen Ziffern.



  • @DirkB
    Ja, und man benutzt auch den richtigen logischen Operator, || ist hier auch falsch.



  • Ich kann den Code wegen der Scheiß, bzw. der Nicht-Formatierung nicht 100%ig lesen, aber ich habe den Eindruck, dass immer nur das erste Zeichen des Strings überprüft wird?!

    Ich versteh auch

    std::cout<<hfu::is_binary<<std::endl;
    

    nicht, kompiliert das überhaupt?



  • @Belli sagte in Testen ob ein String binär ist:

    Ich versteh auch

    std::cout<<hfu::is_binary<<std::endl;
    

    nicht, kompiliert das überhaupt?

    Ja. hfs::is_binary ist ja ein Funktionszeiger. Sowas kann ja vielleicht in bool konvertiert werden - C++ ist immer wieder für Überraschungen gut, daher Warnungen anschalten (-Wpointer-bool-conversion)! Wäre ich spontan nicht drauf gekommen, dass das "1" ausgibt. Ich hätte gedacht, dass man da einen Zeigerwert sehen würde. Falsch gedacht...

    root [0] namespace hfs { bool is_binary(string*){return true;} }
    root [1] cout << hfs::is_binary << "\n";
    ROOT_prompt_1:1:9: warning: address of function 'hfs::is_binary' will always evaluate to 'true' [-Wpointer-bool-conversion]
    cout << hfs::is_binary << "\n";
         ~~ ^~~~~~~~~~~~~~
    ROOT_prompt_1:1:9: note: prefix with the address-of operator to silence this warning
    cout << hfs::is_binary << "\n";
            ^
            &
    1
    


  • Das gibt einfach die Adresse der Funktion aus.



  • @Th69 sagte in Testen ob ein String binär ist:

    Das gibt einfach die Adresse der Funktion aus.

    Eben nicht.



  • OK, es gibt hier nur die Umwandlung bei cout nach bool, so daß 1 (bzw. true) ausgegeben wird. Es kompiliert aber, das wollte ich damit nur sagen!
    Um die Adresse auszugeben ist ein expliziter Cast erforderlich:

    std::cout << reinterpret<const void *>(hfu::is_binary) << std::endl;
    

    Edit:
    @wob, habe jetzt erst deinen Post von gestern gesehen (der wurde mir bisher nicht angezeigt - liegt vllt. daran, daß ich diesen Beitrag als Tab die ganze Zeit offen hatte, aber normalerweise wird bei F5 doch alles aktualisiert?!?).

    Aber selbst mit Adressoperator (&) wird doch trotzdem immer die bool-Konvertierung angewendet und 1 ausgegeben. Kommt denn dann die Warnung wirklich nicht mehr?



  • Aber nochmal zu dem anderen Punkt:
    Die Funktion wird doch nach Prüfung des ersten Zeichens verlassen?



  • Das hatte ich schon mit
    @Th69 sagte in Testen ob ein String binär ist:

    Außerdem ist deine else-Verzweigung logisch falsch

    angedeutet.