Hilfe beim arbeiten mit Feldern



  • @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.



  • An die Anfänger/Neulinge:
    bitte kompiliert euren Code immer mit eingeschalteten Warnungen!

    Wenn ich den Code von @theAnfänger77 kompiliere, ergibt sich:

    $ clang++-7 -Wall -Wextra forum.cpp                   
    forum.cpp:14:48: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl;
                                                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:16: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:36: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                                       ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:24:9: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
        if (Binaer[7] == '1')
            ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    4 warnings generated.
    

    Also - so funktioniert es nicht. Vergesst am Anfang erst einmal die Arrays und nehmt stattdessen std::string für Char-Arrays und std::vector für alle anderen Array-Typen. Ich verwende in C++ praktisch überhaupt keine C-Style-Arrays.


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Herrgott noch mal...

    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;
    

    😆

    Ich schwöre, ich poste hier gleich die fertige Lösung, damit hier endlich Ruhe ist....



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Wieviele Bits kann man da jetzt eingeben?

    Aber warum sollte man eine einfache Lösung verwenden, wenn man sich doch mit char-Arrays auf unendlich vielen Wegen in den Fuß schießen kann?


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    Wieviele Bits kann man da jetzt eingeben?

    Ich seh's schon. Es wird wieder eine überflüssige Null angehängt. 😭


  • Gesperrt

    @It0101 sagte in Hilfe beim arbeiten mit Feldern:

    Herrgott noch mal...
    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;

    Der Herrgott kann nichts dafür. Das war bestimmt der Teufel, der 'cin' auch char-Arrays befüllen lässt.



  • Ach du heilige... ^^
    Zerfleischt euch jetzt nicht wegen einer Anfängerfrage.



  • So ungefähr würde wohl eine halbwegs gescheite Lösung aussehen. Um das Thema hier mal zu beschließen 😉

    int main( int argc, char **argv )
    {
        unsigned long long Dezimal = 0;
        // Zahl eingeben
        std::cout << "Gib eine Binaerzahl ein, beginnend mit dem niederwertigsten Bit: ";
        std::string Binaer = "";
        std::cin >> Binaer;
    
        // Bits berenzen
        if ( Binaer.size() > sizeof( Dezimal  ) * 8 )
        {
            std::cout << "Zuviele Bits fuer Zieldatentyp\n";
            return 0;
        }
    
        // Eingabe ueberpruefen
        for ( const char &bit : Binaer )
        {
            if ( bit != '0' && bit != '1' )
            {
                std::cout << "Binaerzahlen duerfen nur aus 0 oder 1 bestehen\n";
                return 0;
            }
        }
        std::cout << "Binaerzahl erfolgreich eingelesen\n";
    
        // Umrechnen in
        unsigned long long BitValue = 1;
        for ( const char &bit : Binaer )
        {
            if ( bit == '1' )
                Dezimal |= BitValue;
            BitValue = BitValue << 1;
        }
    
        std::cout << "Binaerzahl " << Binaer << " ins Dezimalsystem umgerechnet ergibt " << Dezimal << "\n";
        return 0;
    }
    


  • Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor?
    Und warum steht das niederwertigste Bit am Anfang des strings und nicht am Ende?
    😆


  • Gesperrt

    @DocShoe sagte in Hilfe beim arbeiten mit Feldern:

    Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor? 😆

    Für den C++ noob könnte so der Eindruck enstehen, 'cin' würde die Eingabe an den String anhängen.