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 .