Eingabe besser überprüfen ?



  • Hi,
    ich programmier nun seid ca. einem Jahr und nun auch seid 3Wochen mit C++ (vorher Delphi).
    Ich hab nun ein paar kleinere Projekte (aber schon größer als "Hallo Welt!" etc.) fertig. Dabie viel mir auf, dass der Benutzer auf der Konsole ja eine Menge fehleingaben machen kann- nun denn die Prozedur zum Überprüfen dieser war schnell geschreiben und alles geht wieder. Nun wollt ich diese Prozedur zu einem eigenen header/Klasse zusammenfassen und wollt dazu noch 2 Sachen fragen:
    1. Muss ich beim schreiben eines headers/Klasse etwas besonders beachten?
    2. Kann man eigentlich die Eingabe in der Konsole von vornherin auf eine bestimmte Anzahl begrenzen, sprich schon während der User etwas eingibt die Länge des Strings überprüfen oder das ganze auf bestimmte Zeichen untersuchen, die Wohlmöglich nicht eingegebn werden sollten?
    Im Moment programmier ich auf Windows, also kann der/die Befehle dazu ersteinmal DOS spzezifisch sein, jedoch wollt ich auch eine gute kompatiblität zu Linux herstellen (man will es ja von gleich an richtig lernen :D)

    So, das wars erstma, übrigens schöne TUT-Sammlung, hat mir echt weiter geholfen 😃

    Pille



  • Pille456 schrieb:

    1. Muss ich beim schreiben eines headers/Klasse etwas besonders beachten?

    Ja, vor allem die ODR (One Definition Rule = ein Objekt darf (mit Ausnahmen) im Programm nur einmal definiert werden).

    2. Kann man eigentlich die Eingabe in der Konsole von vornherin auf eine bestimmte Anzahl begrenzen, sprich schon während der User etwas eingibt die Länge des Strings überprüfen oder das ganze auf bestimmte Zeichen untersuchen, die Wohlmöglich nicht eingegebn werden sollten?

    Ja, du kannst einem Eingabestream eine Längenangabe mitgeben:

    cin>>setw(20)>>text;//liest maximal 20 Zeichen (afaik)
    cin.getline(text,20);
    

    (oder du verwendest cin.get(), um den String zeichenweise einzugeben und zusammenzubauen (wenn du gemerkt hast, daß du zu weit bist, hilft unget())



  • hmm okay... nur wo finde ich die Funktion setw?
    Ich hab <iostream.h> eingebunden, dort findet DevC++ die Funktion nicht, dasselbe passiert auch wenn <iostream> einbinde (laut DevC++ eine aktuellere Version von iostream.h, wobei mir die alte besser gefällt :D)



  • Pille456 schrieb:

    hmm okay... nur wo finde ich die Funktion setw?

    Im Header <iomanip>

    Ich hab <iostream.h> eingebunden, dort findet DevC++ die Funktion nicht, dasselbe passiert auch wenn <iostream> einbinde (laut DevC++ eine aktuellere Version von iostream.h, wobei mir die alte besser gefällt :D)

    Da solltest du schnell umdenken - <iostream.h> ist kein Standard-Header und damit nur bedingt mit der STL kompatibel. (und abgesehen vom Namensraum "std::" sollten eigentlich keine Umstellungen nötig sein)



  • So, okay funtzt nun alles.
    Aber ein paar Fragen hätt ich noch 😃
    Wenn ich die Eingabe mit setw() begrentze, dann kann ich im Programm immer noch einen Bufferoverflow durchführen oder? (nur halt keine falschen Werte an das Programm übergeben)
    Kann man den Einlesen-Stream nicht einfach auf eine bestimmte Menge begrentzen, sprich der User kann gar nicht mehr als z.B. 10Zeichen eingeben?

    Ist es schlimm, wenn ich <iostream.h> verwende? Weil ein Großteil der hier vorhandenne Literatur nutzt diese und ich finde die Namenskennung mit std :: vollkommen unsinnig und bescheuert, das ist mehr Tipparbeit und Frödert nicht gerade die Leserlichkeit...



  • Pille456 schrieb:

    Wenn ich die Eingabe mit setw() begrentze, dann kann ich im Programm immer noch einen Bufferoverflow durchführen oder? (nur halt keine falschen Werte an das Programm übergeben)

    Nein, mit setw() legst du fest, daß die Eingabe nach spätestens x Zeichen abgebrochen wird (wenn er mehr eingibt, bleibt der Rest im Eingabepuffer stehen, bis du weiterliest oder ihn per igonre() verwirfst.

    Aber eleganter ist es wohl, anstelle von char-Arrays einen std::string zu verwenden - der sorgt schon von sich aus dafür, daß er nicht überläuft (außer in dem extrem unwahrscheinlichen Fall, daß der Anwender ca. 64000 Zeichen ohne Punkt und Komma eintippt).

    Ist es schlimm, wenn ich <iostream.h> verwende? Weil ein Großteil der hier vorhandenne Literatur nutzt diese und ich finde die Namenskennung mit std :: vollkommen unsinnig und bescheuert, das ist mehr Tipparbeit und Frödert nicht gerade die Leserlichkeit...

    Ja, die Bibliothek <iostream.h> ist veraltet und gehört nicht zum ANSI-Standard (der Header existiert nur noch aus Kompatiblitätsgründen). Und wenn dich das ständige std:: nervt, setz einfach ein using namespace std; an den Anfang deines Programms (btw, andere Teile der Standard-Bibliothek (string, vector,...) liegen auch alle im Namensraum std).



  • hmm, aso ok
    DANKE



  • Allerdings sollte man sich gar nicht erst angewöhnen using namespace std; zu verwenden, da dies oft zu Schwierigkeiten und Mehrdeutigkeiten führt.
    Vor allem die Klasse string gibt es in anderen Projekten wie Sand am Meer.
    Ein std:: macht den Code nicht unleserlicher, sondern verbessert sogar das Verständnis dafür, wo die verwendete Klasse herkommt.

    Verge



  • Und using namespace untergräbt meist den Sinn von namespaces ...


Anmelden zum Antworten