tasten überprüfen



  • hi,

    ich muss überprüfen, wenn der user eine taste klickt, ob es sich um ein steuerzeichen handelt oder nicht.
    die steuerzeichen als dezimalcode laufen von 0-31 und 127.
    habe zwar so weit gebracht, dass er die zeichen überprüft, aber bei manchen tut sich gar nicht.

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    int iscntrl(int c);
    
    int iscntrl(int c){
        int ergebnis=0;
        if(c <= 31 && c >= 0 || c == 0x7F) // 0x7f -> 7F = 127 und 0x = hexa
            ergebnis = 1;
        return ergebnis;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {   
    
        unsigned char zeichen;
        cout << "Bitte ein Zeichen eingeben: ";
        cin >> zeichen;
    
        if(iscntrl(zeichen))
            cout << "Ist ein Steuerzeichen";
        else
            cout << "Kein Steuerzeichen";
        system("pause");
        return 0;
    }
    

    zb. wenn ich die dezimalzahl 0 eingebe, passiert es gar nix oder. auch bei 127 uva. ist das der fall. (um eine dezimalzahl einzugeben bei gedrückter alt taste, die jeweiligen dezimalzahlen auf die nummerntaste eingeben)
    habt ihr eine idee ?

    lg



  • also wenn ich das kompiliere dann funktioniert es ganz normal, dh. wenn ich
    zahlen dezimal mit alt+zahl eingebe kommt die richtige ausgabe ob es nun ein
    steuerzeichen ist oder nicht. Aber die funktion gibt es schon vorgefertigt in einer bliothek, also würde ich sie umbenennen. ausderdem kannst du statt:

    int iscntrl(int c);
    
    int iscntrl(int c){
        int ergebnis=0;
        if(c <= 31 && c >= 0 || c == 0x7F) // 0x7f -> 7F = 127 und 0x = hexa
            ergebnis = 1;
        return ergebnis;
    }
    

    das schreiben:

    int myiscntrl (int c) /* den prototypen kannst du weglassen, wenn die                  
                             implementation vor der main-Funktion erfolgt. außerdem                    
                             gibt es die funktion schon, also myiscntrl, sonst compilererror */
    {
        if(c <= 31 && c >= 0 || c == 0x7F) // 0x7f -> 7F = 127 und 0x = hexa
            return 1; // du kannst dir eine variable sparen, wenn du so zurückgibst.
        return 0;
    }
    


  • Mittels "cin >> zeichen" werden die meisten Steuerzeichen ignoriert (bis du ein druckbares ASCII-Zeichen eingibst), daher bringt deine Abfrage nachher garnichts.
    Mittels Standard C++ (oder C) ist es nicht möglich, die Steuerzeichen (oder besondere Tasten z.B. Funktionstasten) abzufragen.

    Da mußt du dann schon betriebs- oder compilerspezifische Funktionen verwenden...



  • int myiscntrl (int c) /* den prototypen kannst du weglassen, wenn die                  
                             implementation vor der main-Funktion erfolgt. außerdem                    
                             gibt es die funktion schon, also myiscntrl, sonst compilererror */
    {
        if(c <= 31 && c >= 0 || c == 0x7F) // 0x7f -> 7F = 127 und 0x = hexa
            return 1; // du kannst dir eine variable sparen, wenn du so zurückgibst.
        return 0;
    }
    

    Ich hätte mir auch noch überlegt, ob ich nicht gleich einen bool zurückgebe bool myiscntrl(int c);.

    Außerdem hätte ich auch noch auf my verzichten bool IsCntrl(int c);

    Gruß
    Markus



  • Danke Leute!
    Was für einen Unterschied macht es, wenn ich statt int myiscntrl (int c) nur die Funktion bool myiscntrl (int c) benutze ?
    Habe auch so versucht: bool iscntrl (int c) aber hatte dann eine Fehlermeldung.
    Wie ist es damit, wenn ich zb. die Leerzeichen inkl. Zeilenwechsel, Tabulator oder eventuell druckbare Zeichen eingebe ? Würde es auch mit Dezimalzahlüberprüfung funktionieren ?

    lg composer



  • hast dir schonmal überlegt einfach über die tastencodes zu gehen? oder woher kommen die steuerzeichen. aus einer file sind sie ohne weiteres auslesbar, und wenn du sie eingibst und das zeichen nicht einlesen kannst so kannst du aber den tastencode abfragen und prüfen ob gleichzeitig alt gedrückt wird wenn ich das richtig verstanden habe. und wenn dann unbedingt steuerzeichen haben möchtest weist du ja selber welsches steuerzeichen hinter welschem code steht.



  • oelsni schrieb:

    hast dir schonmal überlegt einfach über die tastencodes zu gehen? oder woher kommen die steuerzeichen. aus einer file sind sie ohne weiteres auslesbar, und wenn du sie eingibst und das zeichen nicht einlesen kannst so kannst du aber den tastencode abfragen und prüfen ob gleichzeitig alt gedrückt wird wenn ich das richtig verstanden habe. und wenn dann unbedingt steuerzeichen haben möchtest weist du ja selber welsches steuerzeichen hinter welschem code steht.

    Ja, aber woher hole ichs mir die Tastencodes für die Steuerzeichen ? Ich denke, man kann mit die Tastencodes die Groß- und Kleinbuchstaben lesen, aber nicht die Steuerzeichen oder verstehe ich da etwas falsch ?

    lg



  • da verstehst du was falsch. die taste "a" hast immer den gleichen code. das system erkennt durch gedrücktes shift (capslock) ob dieser code interpretiert werden soll als kleines oder großes "a".

    conio.h
    _kbhit()
    _getch()

    schau msdn bei virtual-key codes, da findest alle code die du brauchst. eine funktion fehlt da leider noch keine ahnung wie die jetzt heisst die gibt dir den status von alt/alt gr/strg/shift/caps zurück, also ob sie gedrückt sind oder nicht. wenn du dazu aber eine visuelle wiedergabe möchstest ist diese lösung leider etwas unschön denn du musst die ausgabe auf den bildschirm machen. _kbhit und _getch geben dir nur die info taste gedrückt und _getch den tastencode. schau mal den threat hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-197215.html

    Edit:

    ich nehme mal ganz stark an das es eine weit schönere methode gibt. da dir aber noch keiner so richtig sagen konnte wie^^, tja denke ich mal wird das dich erstmal am weitesten brigen 😃





  • hehehe, wo ist da der unterschied einige threads hier sind die glatte bedrohung für den eigenen verstand 😃


Log in to reply