Progtwig C, al obtener un error sobre la variable sin inicializar, el progtwig nunca termina

#define _CRT_SECURE_NO_WARNINGS #include  #include  #define MAXGUESSES 5 void Instructions(); int PlayGuess(char solution); char GetLetter(); int CompareLetters(char guess, char solution); int main() { int i = 0; int numgames = 0; char solution; char guess; int compareletter(char guess, char solution); FILE *inp; inp = fopen("letterList.txt", "r"); fscanf(inp, "%c", &solution); Instructions(); //get number of games the user wants to play printf("Please enter the number of games you want to play\n"); scanf("%d", &numgames); for (i = 1; i <= numgames; i++) //print current game (value of i) { //get letter to guess from file fscanf(inp, "%c", &solution); PlayGuess(solution); printf("\nThe letter is %c\n", solution); } fclose(inp); } void Instructions() { printf("Welcome to Letter Guess\n"); printf("To begin you will enter the number of games you want to play(1 – 4 games)\n"); printf("You have 5 chances to guess each letter\n"); printf("Let's begin\n"); } int PlayGuess(char solution) //player defined guesses. { int numGuesses = 0; int winOrLose = 0; while (numGuesses MAXGUESSES) { printf("You have run out of guesses\n"); } } return 0; } //get the guess from the user (call GetLetter function) //call compareLetters function char GetLetter() { char guess = 0; char solution; printf("Enter a guess:", guess); scanf(" %c", &guess); CompareLetters(guess, solution); return guess; } //compare the guess and the solution //return a 1 if they are the same // message based on before or after alphabetically //return a 0 if the guess and answer are not the same int CompareLetters(char guess, char solution) { if (guess == solution) //if answer is correct { printf("Thats it!\n"); return 1; } else if (guesssolution) { printf("The letter you are trying to guess comes before %c", guess); printf("\nTry again\n"); GetLetter(); return 0; } } 

Lo siento si el código es un poco desordenado.

Problema nº 1: la variable “solución” no está inicializada pero no sé cómo solucionarla. Tengo este problema mucho, si es posible podría usar una explicación.

Problema n. ° 2: cuando ejecuto el progtwig y entro la cantidad de juegos que quiero jugar, lo ignora y me da un sinfín de adivinanzas, el progtwig nunca se detiene.

Gracias.

Continuando con mis comentarios, las conclusiones clave de su código son (1) no puede aprender C adivinando la syntax, comstackndo, una y otra vez, (2) validando TODAS las entradas a su progtwig verificando el retorno de todas las funciones de entrada y validando el valor que recibe, (3) habilita las advertencias del comstackdor y luego lee, comprende y corrige cada advertencia antes de intentar comstackr nuevamente, y (4) no acepta el código hasta que se compile limpiamente, sin advertencia.

Dado que su código incluye #define _CRT_SECURE_NO_WARNINGS , es evidente que está en Windows usando cl.exe (ya sea desde cmd.exe o desde VS-Code). Para aprender la progtwigción básica, cierre el código VS, abra la línea de comandos proporcionada por su instalación de VS (o SDK), y no se preocupe por usar el IDE nuevamente, hasta que haya dominado la comstackción desde la línea de comandos y comprenda las opciones del comstackdor. Consulte las opciones del comstackdor C / C ++ de cl.exe o escriba cl /? en el símbolo del sistema.

Desde la línea de comandos, su cadena de comstackción básica debe ser similar a:

 cl.exe /nologo /W3 /Ox /Tc mysource.c 

( /W3 habilita la mayoría de las advertencias, /Ox habilita todas las optimizaciones)

Me resulta útil no saturar mi directorio c-source con archivos .obj y .exe , así que creo dos directorios adicionales /obj y /bin para el objeto y los archivos ejecutables. Luego usa las opciones /Fo y /Fe para decirle al comstackdor que coloque los archivos objeto y los archivos exe en los directorios apropiados, por ejemplo

 cl /nologo /W3 /Ox /Foobj/mysource /Febin/mysource /Tc mysource.c 

Eso pondrá mysource.obj en el directorio obj y mysource.exe en el directorio bin .

Debe tener clara la lógica de su código antes de sentarse detrás del teclado y comenzar a picar. (Ver: (1) arriba). La forma más fácil de mantenerlo en orden dibujando un diagtwig lógico simple para su código e identificando qué valores manejará en main() y luego qué se manejará en cada function() . No necesitas nada sofisticado, una hoja de papel y un lápiz de 8.5×11 te servirán. Después de tener un mapa de ruta claro para lo que hará cada parte de su código, entonces siéntese y comience a picotear.

Poniendo esa lógica a prueba, puede volver a trabajar su código para que tenga mucho más sentido que en la actualidad, por ejemplo

 #define _CRT_SECURE_NO_WARNINGS #include  #include  #define MAXGUESSES 5 void Instructions(); int PlayGuess (char solution); char GetLetter(); int CompareLetters (char guess, char solution); int main (void) { int i = 0, numgames = 0; char solution; FILE *inp = fopen ("letterList.txt", "r"); if (inp == NULL) { fprintf (stderr, "error: file open failed 'letterList.txt'.\n"); return 1; } Instructions(); /* give instructions */ /* get number of games the user wants to play */ printf("Please enter the number of games you want to play: "); if (scanf ("%d", &numgames) != 1) { fprintf (stderr, "error: invalid input - numgames.\n"); return 1; } putchar ('\n'); for (i = 0; i < numgames; i++) { /* get letter to guess from file */ if (fscanf (inp, " %c", &solution) == EOF || solution < ' ' || '~' < solution) { fprintf (stderr, "error: invalid character - solution.\n"); return 1; } printf (" ==> Game %d <==\n\n", i + 1); PlayGuess (solution); printf("The letter was '%c'!\n\n", solution); } fclose (inp); return 0; /* main() is type int and returns a value */ } void Instructions() { printf ("Welcome to Letter Guess\n" "To begin you will enter the number of games you want " "to play (1 – 4 games)\n" "You have 5 chances to guess each letter\n" "Let's begin\n\n"); } int PlayGuess (char solution) { int numGuesses = 0; char guess; while (numGuesses < MAXGUESSES) { guess = GetLetter(); if (CompareLetters (guess, solution)) return 1; numGuesses = numGuesses + 1; } printf ("You have run out of guesses\n"); return 0; } /* get a letter and validate it is good */ char GetLetter() { char guess = 0, tmp; printf ("Enter a guess: "); if (scanf (" %c", &tmp) != EOF && ' ' <= tmp && tmp <= '~') guess = tmp; return guess; } /* compare the guess and the solution * return a 1 if they are the same * message based on before or after alphabetically * return a 0 if the guess and answer are not the same */ int CompareLetters(char guess, char solution) { if (guess == solution) /* answer is correct */ { printf ("Thats it!\n\n"); return 1; } if (guess < solution) printf ("The letter you are trying to guess comes after '%c'\n", guess); else printf ("The letter you are trying to guess comes before '%c'\n", guess); printf ("Try again\n\n"); return 0; } 

Ejemplo de cadena de comstackción para cl.exe (VS)

 >cl /nologo /W3 /Ox /Foobj/guessletter /Febin/guessletter /Tc guessletter.c 

Ejemplo de uso / salida

 > bin\guessletter.exe Welcome to Letter Guess To begin you will enter the number of games you want to play (1 – 4 games) You have 5 chances to guess each letter Let's begin Please enter the number of games you want to play: 2 ==> Game 1 <== Enter a guess: k The letter you are trying to guess comes before 'k' Try again Enter a guess: c The letter you are trying to guess comes after 'c' Try again Enter a guess: d Thats it! The letter was 'd'! ==> Game 2 <== Enter a guess: e The letter you are trying to guess comes after 'e' Try again Enter a guess: g The letter you are trying to guess comes before 'g' Try again Enter a guess: f Thats it! The letter was 'f'! 

Mire las cosas y piense en cómo abordar la progtwigción en C. Es un lenguaje exacto. Depende de usted tener en cuenta todos los caracteres de todos los buffers de entrada, así como el uso de su memoria. Si no sabe qué parámetros toma una función de biblioteca, o qué tipo y valor devolverá, o cómo usarla, búsquelo. Las páginas del manual están disponibles en, por ejemplo, msdn fscanf, fwscanf o scanf (3): conversión de formato de entrada )

Déjame saber si tienes más preguntas.


Aceptando entrada en cualquier caso, convirtiendo a minúsculas

Para aceptar la entrada en cualquier caso y convertir el valor a minúsculas para que la guess sea ​​siempre minúscula en su código, necesita cambiar solo una línea:

 /* get a letter and validate it is good * (convert letter to lowercase) */ char GetLetter() { char guess = 0, tmp; printf ("Enter a guess: "); if (scanf (" %c", &tmp) != EOF && ' ' <= tmp && tmp <= '~') guess = tolower (tmp); return guess; } 

nota: para los caracteres ASCII, el sexto bit es el 'bit de caso', si es 1 , el carácter está en minúscula, 0 mayúscula. tolower se puede escribir simplemente como:

 unsigned c_tolower (unsigned c) { if ('A' <= c && c <= 'Z') c ^= (1 << 5); return c; } 
  1. Simplemente ponga char solution = '\0'; . Es suficiente para deshacerse de la advertencia.
  2. Intente imprimir el valor de los numgames que acaba de leer en la función scanf() . Parece que estás obteniendo un valor inválido por alguna razón …

Upd: Veo tu problema: estás llamando a GetLetter() desde PlayGuess() ; y estás llamando a CompareLetters() desde GetLetter() ; y luego llama a GetLetter() desde CompareLetters() para crear una recursión infinita. Eliminar llamadas GetLetter() de CompareLetters() .

Debe inicializar la guess y la solution a algo antes de usarlos en una función.

Y que hace esta linea

 int compareletter(char guess, char solution); 

indica, no hay ninguna función con el mismo nombre ni es una llamada a ninguna función.

En caso de inicialización ficticia puede utilizar

 solution = '\0';