C程序,获得有关未初始化变量的错误,程序永远不会结束

#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; } } 

对不起,如果代码有点乱。

问题#1:变量“解决方案”未初始化但我不知道如何解决它。 我有很多这个问题,如果可能的话我可以使用解释。

问题2:当我启动程序并输入我想玩的游戏数量时,它会忽略它并给我无穷无尽的猜测,程序永远不会停止。

谢谢。

继续我的评论,你的代码的关键要点是(1)你不能通过猜测语法,编译,反复学习C, (2)通过检查所有输入函数的返回和validation来validation程序的所有输入您收到的值, (3)启用编译器警告 ,然后在尝试再次编译之前读取,理解并更正每个警告,以及(4)在没有警告的情况下完全编译之前不接受代码。

由于您的代码包含#define _CRT_SECURE_NO_WARNINGS ,因此很明显您使用的是cl.exe (来自cmd.exe或来自VS-Code)。 要学习基本编程,请关闭VS-Code,打开VS(或SDK)安装提供的命令行,并且不必担心再次使用IDE,直到从命令行掌握编译并理解编译器选项为止。 请参阅cl.exe C / C ++编译器选项 ,或键入cl /? 在命令提示符下。

从命令行,您的基本编译字符串应类似于:

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

/W3启用大多数警告, /Ox启用所有优化)

我发现使用.obj.exe文件不会弄乱我的c-source目录很有帮助,所以我为对象和可执行文件创建了两个额外的目录/obj/bin 。 然后使用/Fo/Fe选项告诉编译器将目标文件和exe文件放在正确的目录中,例如

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

这将把mysource.obj放在obj目录中,将mysource.exe放在bin目录中。

在坐在键盘后面开始啄食之前,你必须清楚自己的代码逻辑。 (见上文(1) )。 通过为代码绘制一个简单的逻辑图并确定将在main()处理哪些值然后在每个function()处理的内容来保持直线的最简单方法。 你不需要任何花哨的东西,8.5×11的纸和铅笔都可以。 在您清楚地了解代码的每个部分将要做什么之后,然后坐下来开始啄食。

将该逻辑用于测试,您可以重新编写代码,使其比现在更有意义,例如

 #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; } 

示例编译cl.exe (VS)的字符串

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

示例使用/输出

 > 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'! 

仔细研究并思考如何用C语言编程。这是一种精确的语言。 由您来计算所有输入缓冲区中的所有字符以及内存使用情况。 如果您不知道库函数采用什么参数,或者它将返回什么类型和值,或者如何使用它,请查找它。 手册页可在以下url获得,例如msdn fscanf,fwscanf或scanf(3):输入格式转换 )

如果您还有其他问题,请与我们联系。


在任何情况下接受输入,转换为小写

要在任何情况下接受输入并将值转换为小写,以便guess在代码中始终为小写,则只需更改一行:

 /* 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; } 

注意:对于ASCII字符,第6位是'case bit',如果是1 ,则字符为小写, 0大写。 tolower可以简单地写成:

 unsigned c_tolower (unsigned c) { if ('A' <= c && c <= 'Z') c ^= (1 << 5); return c; } 
  1. 只需把char solution = '\0'; 。 这足以摆脱警告。
  2. 尝试打印刚刚在scanf()函数中读取的numgames值。 由于某些原因,你似乎得到了一些无效的价值……

更新:我看到你的问题了:你是从PlayGuess()调用PlayGuess() ; 你从GetLetter()调用GetLetter() ; 然后从CompareLetters()调用GetLetter() ,以便创建无限递归。 从GetLetter()删除调用GetLetter() CompareLetters()

在函数中使用它们之前,必须初始化guesssolution

什么是这条线

 int compareletter(char guess, char solution); 

表示,没有相同名称的函数,也不是对任何函数的调用。

如果是虚拟初始化,您可以使用

 solution = '\0';