Problem mit ncurses und Input



  • Hallo zusammen,

    ich habe momentan ein Problem um die Eingabe eines Users in NCurses auszulesen. Laut http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/index.html ließt wgetch() nur einen Char ein. Deswegen habe ich wohl hiermit Probleme.

    int32_t amount = wgetch(win);
    

    wenn ich mir das ausgeben lasse. Bekomme ich komischerweise anstatt 1, wenn ich 1 eingebe, eine 49. Keine Ahnung wie das zustande kommt. In der Doku steht aber das nur ein Zeichen eingelesen wird bei wgetch(). Also habe ich auch wscanf(char *c) gewechselt. Nun habe ich aber Probleme die Eingabe zu lesen und zu prüfen.
    Hab mehrere Sachen probiert und habe momentan das hier als Code. Was leider nicht funktioniert, da ich immer 0 als Ergebnis erhalte.

    char *c = new char();
        wscanw(win, c);
        m_Amount = atoi(c);
        std::cout << m_Amount;
        delete c;
    

    Hat jemand eine Idee wie ich deine Eingabe in ein int32_t bekomme und die Eingabe noch auf einen Integer überprüfe? Damit das Programm nicht abstürzt.



  • Hab das jetzt erstmal so gelöst. Aber es findet noch keine Prüfung statt ob der eingegebene Wert ein Int ist.

    char *c = new char();
        wgetstr(win, c);
        m_Amount = atoi(c);
        delete c;
    

  • Mod

    Wenn du lange, formatierte Zahlen lesen möchtest: wscanw & Co. sind schon richtig.

    Wenn du nur Ziffern(zeichen) auf Zahlen mappen möchtest: ziffer - '0' = zahlenwert. Daher hat '1' auch den Wert 49, weil bei dir '0' anscheinend den Wert 48 hat.

    char *c = new char();
        wscanw(win, c);
        m_Amount = atoi(c);
        std::cout << m_Amount;
        delete c;
    

    Da ist so ziemlich jede Zeile total falsch. wscanw ist ein Äquivalent von scanf und ist genau so zu benutzen. Die C-Stringfunktionen kommen nur mit C-Strings klar, also nullterminierten Arrays. new/delete benutzt man nie. Um einen Zeiger auf ein Zeichen zu erhalten, brauchst du keine dynamische Speicherverwaltung.



  • SeppJ schrieb:

    Wenn du lange, formatierte Zahlen lesen möchtest: wscanw & Co. sind schon richtig.

    Wenn du nur Ziffern(zeichen) auf Zahlen mappen möchtest: ziffer - '0' = zahlenwert. Daher hat '1' auch den Wert 49, weil bei dir '0' anscheinend den Wert 48 hat.

    char *c = new char();
        wscanw(win, c);
        m_Amount = atoi(c);
        std::cout << m_Amount;
        delete c;
    

    Da ist so ziemlich jede Zeile total falsch. wscanw ist ein Äquivalent von scanf und ist genau so zu benutzen. Die C-Stringfunktionen kommen nur mit C-Strings klar, also nullterminierten Arrays. new/delete benutzt man nie. Um einen Zeiger auf ein Zeichen zu erhalten, brauchst du keine dynamische Speicherverwaltung.

    wenn ich nur

    char *c;
    

    schreibe stürzt mein Program ab mit Speicherzugriffsfehler (Speicherabzug geschrieben). Der Compiler meckert da nicht. Wie hat das dann auszusehen? Hatte viele Möglichkeiten durchprobiert und die obige war die einzigste die funktioniert.


  • Mod

    Adressoperator? Bitte lern erst einmal die Sprache richtig! Das sind absolute Grundlagen, die du brauchst, um überhaupt irgendwelche fremden (oder spracheigenen) Bibliotheken benutzen zu können.



  • SeppJ schrieb:

    Adressoperator? Bitte lern erst einmal die Sprache richtig! Das sind absolute Grundlagen, die du brauchst, um überhaupt irgendwelche fremden (oder spracheigenen) Bibliotheken benutzen zu können.

    Weder

    char c;
    wscanw(win, &c);
    

    funktioniert, noch

    char *c;
    wscanw(win, c);
    

    Ergibt beides Speicherzugriffsfehler (Speicherabzug geschrieben). Außerdem funktioniert wscanw bei mir nicht. Wenn ich in meinem obigen Code getstr() gegen wscanw tausche, dann ist die Variable bei mir immer 0. Wenn ich zB 10 eintippe steht 0 in der Variable.

    edit: wenn ich das mache, dann stürzt wenigstens das Programm nicht ab

    char c[30];
    wscanw(win, c);
    

    aber da habe ich immer noch das Problem mit wscanw()



  • Da fehlt der Format-Parameter beim Aufruf von wscanw...


Anmelden zum Antworten