La cadena tiene contenido aunque no haya entrada del usuario

Estoy intentando “atrapar” las entradas de teclado del usuario, lo que significa que el código evitará que ingresen ciertos caracteres, lo que en este caso impide la entrada de números y caracteres especiales.

#include  #include  #include  #include  #include  char buffer[30]; void in_text(); int main(void) { in_text(); printf ("\nThe string you entered is: %s", buffer); return 0; } void in_text(void) { char buffe[30]; char c1; int x = 0, hit = 0; printf("Enter string: "); while (hit!=1) { c1 = getch(); if (c1=='\b' && x!=0) { buffe[--x] = '\0'; printf ("\b \b"); } if (isalpha(c1) || isspace(c1) && c1!='\r') { buffe[x++] = c1; buffe[x+1] = '\0'; printf("%c", c1); } if (c1=='\r' && strlen(buffe)==0) { buffe[x+1] = '\0'; } else if (c1=='\r' && strlen(buffe)>1) { printf ("%d", strlen(buffe)); printf ("\n%s", buffe); hit = 1; } else{ } } strcpy(buffer, buffe); return 1; } 

Este código intenta imitar el estilo de entrada de scanf que se puede ver y presionar la tecla de retroceso para eliminar un carácter ingresado previamente. Quiero “atrapar” la tecla enter de manera que cuando el usuario presiona “Enter”, el progtwig verifica si la cadena actual (buffe) contiene al menos un carácter válido y cuando el progtwig verifica la entrada y descubre que el usuario presionó la tecla Intro y la cadena no contienen nada, el bucle continúa.

El problema con mi código es que cuando strlen Intro, inmediatamente después de que se inicie el progtwig, la función strlen devuelve un valor mayor que 0, lo que supongo que no es normal ya que no hay entrada del usuario aún, aparte de eso “Ingrese “tecla que el usuario presionó.

Tiene alguna idea sobre esto?

Leyendo variables sin inicializar como hecho para buffe aquí:

 if (c1=='\r' && strlen(buffe)==0) 

Provoca un comportamiento indefinido, cualquier cosa podría pasar después. No hagas esto.

Siempre inicialice la variable antes de leerlos.

En este caso, le gustaría hacer simplemente:

 char buffe[32] = ""; 

o (como ya han propuesto otros) la forma más genérica:

 char buffer[32] = {0}; 

Más complicado pero también válido sería hacer:

 char buffer[32]; strcpy(buffe, ""); 

o

 char buffer[32]; memset(buffe, 0, sizeof(buffe)); 

Se puede intentar

 char buffe[30] = {0}; 

(No he probado este thouggh)

La memoria siempre contiene algo. El espacio utilizado por su variable contiene algo, y llamar a strlen () para que no explote en ninguna parte.

Tenga en cuenta que el sistema operativo generalmente lee una línea completa (y permite editarla), enviándola a la aplicación de lectura solo en ENTER. Manejar esto es significativamente más difícil que la simple lectura. ¿Está seguro de que no es lo suficientemente bueno como para obtener una línea, revisarlo y quejarse o seguir adelante?

ya que su buffe tendrá memoria en la stack, contendrá algún valor de basura que mejor inicialice con cero o mejor es usar la función memset ().