Entonces, después de ejecutar el siguiente código, en la primera iteración imprime la variable de menú y espera un par de entradas. Pero cuando llega a la segunda iteración, simplemente omite get () y switch () solo imprime el menú y la var "input" en blanco. Pero luego, en la tercera iteración, funciona correctamente. Entonces, ¿por qué omite cada segunda iteración de esa manera?

int main(void) {
    char menu[] = "1 - run first task\n2 - run se...";
    while (1) {
        char input[20];
        printf(menu);
        gets(input);
        puts(input);
        if (checker1(input))
            switch(input[0]) {
            case ('1'):
                task1();
                break;
            case('2'):
                task2();
                break;
            case('c'):
                system("cls");
                break;
            case('x'):
                return 0;
            }
    }
}
-1
user9393410 22 feb. 2018 a las 01:17

2 respuestas

La mejor respuesta

El código publicado no contiene suficiente información para diagnosticar su problema. Publique un MCVE (ejemplo mínimo, completo y verificable) para obtener una respuesta precisa.

Sin embargo, tenga en cuenta que el uso de gets() es una causa de posibles desbordamientos del búfer, que tiene un comportamiento indefinido, una posible explicación de cualquier resultado inesperado.

Utilice fgets() en su lugar y pase el tamaño de la matriz de destino.

-2
chqrlie 22 feb. 2018 a las 08:51

Aunque esta pregunta ya está respondida, me di cuenta de que hay bastantes cosas que no son profesionales con su código.

Comenzando con char menu[] = "1 - run first task\n2 - run se...";

Aunque no dar tamaño e inicializar de inmediato funciona en C, no es una buena práctica, siempre debe definir un tamaño estricto o asignarlo dinámicamente (usando malloc o calloc).

En segundo lugar, estás usando gets() para leer desde la consola, lo cual es algo peligroso y hace que tu aplicación sea vulnerable. gets() se considera peligroso debido a su incapacidad para manejar cadenas que son más grandes que el tamaño del búfer. Y dado que está tomando la entrada del usuario, es aún peor, porque siempre debe considerar la posibilidad de que el usuario ingrese lo que se supone que no debe ingresar. Nunca cuente con la misericordia de los usuarios. Utilice fgets para leer desde un archivo o consola, ya que puede definir cuántos bytes máximos desea leer a la vez.

En tercer lugar, al usar la instrucción switch, junto con los casos que desea manejar, siempre cree también un caso predeterminado. Lo mismo, no cuente con el usuario. Pueden suponer que deben ingresar '1', pero ¿qué pasa si ingresan '9'? Si no ha manejado ese caso, es posible que tenga un comportamiento inesperado de la aplicación.

Cuarto, veo que aquí su objetivo principal es permitir que el usuario decida la opción del menú, en lugar de usar una cadena, puede usar un carácter, y en lugar de gets() o fgets(), puede usar {{X2} } o getchar().

A continuación se muestra una pequeña versión modificada de su código

int main(void)
{    
    char menu[200] = "1 - run first task\n2 - run se...";
    char x = 0;

    while (1)
    {
        puts(menu);
        x = getch();

        switch (x)
        {
        case ('1'):
            task1();
            break;

        case('2'):
            task2();
            break;

        case('c'):
            system("cls");
            break;

        case('x'):
            break;

        default:
            printf("Please choose a valid option!!");
            break;
       }
    }   
}

`

0
Shrey 22 feb. 2018 a las 00:37