Pregunta

Si quiero recibir una entrada de caracteres en C, ¿cómo puedo comprobar para ver si hay un exceso de personajes que fueron enviados, y si es así, ¿cómo puedo borrar eso?

Hay una función que actúa como getc(stdin), pero que no pedirá al usuario que introduzca un carácter, así que sólo puedo poner while(getc(stdin)!=EOF);?O una función para echar un vistazo a la siguiente carácter en el buffer, y si no devuelve NULL (o lo que sea estaría allí), me podría llamar a un(tro) función que vacía stdin?

Editar

Así que ahora, scanf parece estar haciendo el truco, pero hay una manera de conseguir que se lea el todo cadena, hasta el salto de línea?En lugar de la más cercana a los espacios en blanco?Sé que sólo puede poner "%s %s %s" o lo que sea en la cadena de formato, pero puedo manejar un número arbitrario de espacios?

¿Fue útil?

Solución

No se puede eliminar el flujo de entrada. Se le invoca un comportamiento indefinido si lo hace. Su mejor apuesta es hacer:

int main() {
  int c = getchar();
  while (getchar() != EOF);
  return 0;
}

Para usar scanf mágica:

#include <stdio.h>
#include <stdlib.h> 

#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256

int main() {
  char buf[ BUFSZ + 1 ];
  int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
  if (!feof(stdin)) {
    getchar();
  }
  while (rc == 1) {
    printf("Your string is: %s\n", array);
    fflush(stdout);
    rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
    if (!feof(stdin)) {
        getchar();
    }
   }
   return 0;
}

Otros consejos

Puede utilizar getline para leer toda una línea de entrada.

Como alternativa (en respuesta a su pregunta original), puede llamar o select poll la entrada estándar para ver si hay caracteres adicionales que se deben leer.

He tenido un problema similar en la actualidad, y he encontrado una manera que parece funcionar. No sé los detalles de su situación, por lo que no sé si va a trabajar para usted o no.

Estoy escribiendo una rutina que necesita para obtener un solo carácter desde el teclado, y tiene que ser uno de los tres pulsaciones de teclas específicas (a '1', '2', o un '3'). Si no es uno de esos, el programa necesita para enviar y mensaje de error y bucle para otro intento.

El problema es que, además del carácter I entran ser devuelto por getchar (), la pulsación de tecla 'Enter' (que envía la pulsación de tecla al programa) se guarda en un buffer de entrada. Eso (de no impresión) de nueva línea caracteres se devuelve entonces por la instalación getchar () en el bucle de corrección de errores, lo que resulta aún más en un segundo mensaje de error (ya que el salto de línea caracteres no es o bien un '1', a '2' , ni un '3'.)

El problema se complica aún más porque a veces tengo delante de mí mismo y en lugar de entrar en un solo carácter, voy a entrar en el nombre de archivo que una de estas opciones se solicite. Entonces tengo toda una cadena de caracteres no deseados en el búfer, lo que resulta en una larga lista de mensajes de error de desplazamiento por la pantalla.

No está bien.

Lo que parece haber fijado que, sin embargo, es la siguiente:

c = getchar();  // get first char in line
while(getchar() != '\n') ; // discard rest of buffer

La primera línea es la que realmente utiliza el carácter entro. La segunda línea dispone de cualquier residuo que queda en la memoria intermedia de entrada. Simplemente crea un lazo que tira de un carácter a la vez desde el buffer de entrada. No hay acción especificada a tener lugar mientras que la declaración es un bucle. Simplemente lee un carácter y, si no es un salto de línea, se remonta a la siguiente. Cuando encuentra una nueva línea, el bucle termina y se pasa a la siguiente orden del día en el programa.

Podemos hacer una función para borrar la memoria de líneas, así:

#include <stdio.h>

void clear_buffer(){
   char b;
   //this loop take character by character in the keyboard buffer using 
   //getchar() function, it stop when the variable "b" was
   //enter key or EOF.
   while (((b = getchar()) != '\n') && (b != EOF));
}

int main()
{
    char input;
    //get the input. supposed to be one char!
    scanf("%c", &input); 
    //call the clearing function that clear the buffer of the keyboard 
    clear_buffer(); 
    printf("%c\n",input); //print out the first character input
    // to make sure that our function work fine, we have to get the
    // input into the "input" char variable one more time
    scanf("%c", &input); 
    clear_buffer();  
    printf("%c\n",input);
    return 0;
}

El uso de una lectura que va a tomar un montón de personajes (más de 1, tal vez 256), y ver cuántos de ellos son realmente devuelto.Si usted recibe más de uno, usted sabe;si solo tienes uno, eso es todo lo que hay disponible.

Que no menciona a la plataforma, y esto se pone bastante complicado bastante rápido.Por ejemplo, en Unix (Linux), el mecanismo normal devolverá una línea de datos - probablemente, uno de los caracteres que fueron después y con una nueva línea.O tal vez usted persuadir a que el usuario escriba ^D (predeterminado) para enviar el carácter anterior.O tal vez el uso de las funciones de control para poner el terminal en modo raw (como programas tales como vi y emacs hacer).

En Windows, no estoy tan seguro, creo que hay un getch() la función que hace lo que usted necesita.

¿Por qué no usar scanf en lugar de getc, mediante el uso de scanf u puede conseguir toda la cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top