Bloquear la entrada de caracteres en C

renaudh Mensajes publicados 143 Fecha de registro   Estado Miembro Última intervención   -  
 Vercors -
Hola,

Me gustaría saber cómo bloquear la entrada de caracteres en un programa en C.
Ya tengo este bucle:
while ((c<49)||(c>55)) //49= código ASCII de 1 y 55=código ASCII de 7 { printf("%s, entra la columna\n",jugador1); //tanto si el jugador no introduce un carácter entre 1 y 7 inclusive, volvemos a pedir la entrada c=getche(); printf("\n"); }

que vuelve a pedir la columna mientras el carácter introducido no está entre 1 y 7, y lo que me gustaría es que los caracteres incorrectos no aparezcan en pantalla, es decir, bloquear el teclado para que el usuario solo pueda introducir caracteres entre 1 y 7.

Gracias por vuestra ayuda.

13 respuestas

  1. blurk Mensajes publicados 493 Fecha de registro   Estado Miembro 160
     
    hola

    reemplazar
     c=getche(); printf("\n");

    por
    while((c=getche())<45 ||c>55); printf("%c\n",c); 
    --

    cordialmente
    ¤
    0
  2. Marden Mensajes publicados 1075 Estado Miembro 210
     
    En mi opinión, habría que buscar en las opciones echo/noecho del terminal (como para la entrada de contraseñas).
    0
  3. renaudh Mensajes publicados 143 Fecha de registro   Estado Miembro Última intervención   3
     
    He intentado tu tratamiento blurk pero empeora, todavía puedo ingresar cualquier carácter y además ya no toma la entrada.
    Para el echo/noecho, ¿estás seguro de que hablas del lenguaje C porque me suena a scripts?
    0
  4. belette
     
    Te propongo esta modificación:

    printf("%s, entrer la colonne\n",joueur1);
    c=getch();
    while ((c<49)||(c>55))
    {
    c=getch();
    }

    Debería funcionar.
    0
  5. brainniac
     
    sí, pero si necesito impedir a un usuario que ingrese una letra, ¿qué hago?
    0
  6. blurk
     
    What letter?
    0
    1. brainniac
       
      ok, si en un menú que contiene 4 opciones y debemos ingresar un número para acceder a una de ellas; digamos del 1 al 4 y A la variable que recibe el valor. es simple con un bucle while. Solo tenemos que decir
      do
      {
      ----------------------------------------------------
      ----------------------------------
      }
      while( A<=1 && A=>4);

      pero si además debo evitar al mismo tiempo que el usuario introduzca letras del alfabeto, ¿qué hago?
      y podría haber usado switch y default, pero quiero que el usuario siga teniendo el menú delante y vuelva a elegir.
      0
  7. Char Snipeur Mensajes publicados 10112 Fecha de registro   Estado Colaborador Última intervención   1 331
     
    Hola.
    mira ahí https://en.cppreference.com/w/ sobre la E/S de C
    prueba scanf("%[1234567]\n",&c);
    o bien scanf("%c\x8",&c);
    \x8 es el carácter de retroceso (borrado) código ASCII 8.
    No garantizo nada, pero podría ser una idea.
    si no, prueba ungetc
    o aún:
    c=getch();
    if (c...) printf("%c",char(8));
    --

    Saludos! Cuando no sabes, ¡no toques nada!JBT
    Char Snipeur
    0
  8. blurk
     
    - El código ASCII 8 corresponde a la flecha hacia la izquierda y no a backspace (127)
    - A partir del momento en que se usa scanf, el control de la entrada solo se efectúa en el momento en que el usuario presiona la tecla de entrada.
    Por lo tanto, es imposible evitar que se pulse un carácter desde esta función.
    Las soluciones para este tipo de problema son del tipo while !kbhit() o getch() pero es de Borland y no está disponible en Unix
    0
  9. blurk
     
    <supr> elimina lo que está a la derecha del cursor, se encuentra en 2 ejemplares en los pad numéricos y de posicionamiento, backspace elimina lo que está a la izquierda del cursor, y está situado sobre la tecla de entrada. Se trata de backspace.
    0
  10. Char Snipeur Mensajes publicados 10112 Fecha de registro   Estado Colaborador Última intervención   1 331
     
    uh... blurk, isn’t that what I just said?
    So we agree: 8 corresponds to backspace (left arrow) and 127 to delete (del or delete).
    To delete a written character, I tested this and it works:
    printf("->a\x8%c\x8",char(32));
    this line writes "->a" then backspace moves the cursor back one position, char(32) (the space) erases 'a' from the screen, then we place the cursor behind '->' again with the \x8 command.
    there you go, it doesn’t solve your problem, but it gives you an idea of what we can do with ASCII codes.
    --

    Best regards! Quand on sait pas, on touche pas !JBT
    Char Snipeur
    0
  11. blurk
     
    hola francotirador

    de hecho no del todo

    8 es la flecha izquierda que no tiene valor de borrado
    9 es la flecha derecha

    backspace es como 8 pero con un borrado

    supr es como un 9 con un borrado

    además, atención es ASCII, con las páginas de códigos ya no funciona igual
    el ASCII se detiene en 127 y más allá, cada idioma (o país) tiene su propio sistema de caracteres acentuados. (debajo de 32 que corresponde a la barra espaciadora, igual, cambia según la página de códigos)
    sous Windows, lo que está debajo de 32 o más allá de 127 no se comporta igual que en un terminal Unix, o Minitel
    en general, no va a funcionar igual bajo Windows y bajo Linux y en un Mac, porque el ASCII de hoy está cubierto por una capa de páginas de códigos.

    intenta pulsar la tecla Alt, y al mismo tiempo escribes el código ASCII, y ahí ves lo que pasa

    a+
    0
  12. Vercors
     
    ¿Cómo desbloquear una entrada de texto que está bloqueada en este momento?
    0