usar una resueltos recorrer lenguaje leer funciones ejercicios ejemplos como caracteres cadenas cadena arreglo c input while-loop fgets

una - leer cadena de caracteres en c



Bucles simples y longitud de cadena en C (2)

Soy bastante nuevo para C. Escribo en Visual Studio 2015 y estoy tratando de incitar de manera segura a un usuario a buscar una cadena usando fgets. Quiero usar fgets para obtener la cadena, verificar si la cadena es demasiado larga, y reprompt el usuario si es hasta que ingresen una buena cadena. Aquí está mi código

/* * Nick Gilbert * COS317 Lab 2 Task 2 */ #include "stdafx.h" int main() { char str[10]; int isValid = 0; while (isValid == 0) { printf("Please enter a password: "); fgets(str, 10, stdin); if (strlen(str) == 9 && str[8] != ''/n'') { //http://stackoverflow.com/questions/21691843/how-to-correctly-input-a-string-in-c printf("Error! String is too long/n/n"); memset(&str[0], 0, sizeof(str)); } else { printf(str); isValid = 1; } } printf("Press ''Enter'' to continue..."); getchar(); }

Sin embargo, cuando ejecuto esto e ingreso una cadena incorrecta, ¡los caracteres sobrantes se alimentan automáticamente en los próximos fgets!

¿Cómo puedo solucionar esto para hacer lo que quiero que haga?


Prueba esto:

#include "stdafx.h" int main() { char str[10]; int isValid = 0; while (isValid == 0) { printf("Please enter a password: "); fgets(str, str, stdin); if (strlen(str) == 9 && str[8] != ''/n'') { //http://.com/questions/21691843/how-to-correctly-input-a-string-in-c printf("Error! String is too long/n/n"); memset(str, 0, sizeof(str)); } else { printf("%s",str); isValid = 1; } } printf("Press ''Enter'' to continue..."); getchar(); }

En adición:

Mientras usa memset() , puede usar directamente el array_name lugar del &array_name[0] .


Si la cadena leída por fgets no finaliza con una nueva línea, llame a fgets en un bucle hasta que lo haga, luego solicite al usuario nuevamente.

if (strlen(str) > 0 && str[strlen(str)-1] != ''/n'') { printf("Error! String is too long/n/n"); do { fgets(str, 10, stdin); } while (strlen(str) > 0 && str[strlen(str)-1] != ''/n'') { }

Además, nunca pase una variable en el primer argumento para printf , particularmente si el contenido de esa variable proviene de datos ingresados ​​por el usuario. Si lo hace, puede provocar una vulnerabilidad de cadena de formato .