C程序,获取关于未初始化变量的错误,程序永远不会结束 \define\u CRT\u SECURE\u NO\u警告 #包括 #包括 #定义最大猜测5 无效指令(); int-PlayGuess(字符解决方案); char GetLetter(); int CompareLetters(字符猜测、字符解决方案); int main() { int i=0; int numgames=0; 炭溶液; 猜字符; int compareletter(字符猜测,字符解决方案); 文件*inp; inp=fopen(“letterList.txt”,“r”); fscanf(inp、%c、&solution); 指令(); //获取用户想要玩的游戏数 printf(“请输入您想要玩的游戏数量\n”); scanf(“%d”和numgames); 对于(i=1;i最大猜测) { printf(“您已经猜到了”\n”); } } 返回0; } //从用户处获取猜测(调用GetLetter函数) //调用compareLetters函数 char GetLetter() { 字符猜测=0; 炭溶液; printf(“输入猜测:”,猜测); scanf(“%c”和“&guess”); 比较器(猜测、解决方案); 返回猜测; } //比较猜测和解决方案 //如果相同,则返回1 //基于字母前后顺序的消息 //如果猜测和答案不相同,则返回0 int CompareLetters(字符猜测、字符解决方案) { if(猜测=解决方案)//如果答案正确 {printf(“就是它!\n”); 返回1; } 其他的 如果(猜测解决方案) {printf(“您试图猜测的字母出现在%c之前”,guess); printf(“\n再次尝试\n”); GetLetter(); 返回0; } }
对不起,如果代码有点乱 问题1:变量“solution”未初始化,但我不知道如何修复它。我经常遇到这个问题,如果可能的话,我需要一个解释 问题#2:当我启动程序并输入我想玩的游戏数量时,它会忽略它并给我无尽的猜测,程序永远不会停止 谢谢C程序,获取关于未初始化变量的错误,程序永远不会结束 \define\u CRT\u SECURE\u NO\u警告 #包括 #包括 #定义最大猜测5 无效指令(); int-PlayGuess(字符解决方案); char GetLetter(); int CompareLetters(字符猜测、字符解决方案); int main() { int i=0; int numgames=0; 炭溶液; 猜字符; int compareletter(字符猜测,字符解决方案); 文件*inp; inp=fopen(“letterList.txt”,“r”); fscanf(inp、%c、&solution); 指令(); //获取用户想要玩的游戏数 printf(“请输入您想要玩的游戏数量\n”); scanf(“%d”和numgames); 对于(i=1;i最大猜测) { printf(“您已经猜到了”\n”); } } 返回0; } //从用户处获取猜测(调用GetLetter函数) //调用compareLetters函数 char GetLetter() { 字符猜测=0; 炭溶液; printf(“输入猜测:”,猜测); scanf(“%c”和“&guess”); 比较器(猜测、解决方案); 返回猜测; } //比较猜测和解决方案 //如果相同,则返回1 //基于字母前后顺序的消息 //如果猜测和答案不相同,则返回0 int CompareLetters(字符猜测、字符解决方案) { if(猜测=解决方案)//如果答案正确 {printf(“就是它!\n”); 返回1; } 其他的 如果(猜测解决方案) {printf(“您试图猜测的字母出现在%c之前”,guess); printf(“\n再次尝试\n”); GetLetter(); 返回0; } },c,C,对不起,如果代码有点乱 问题1:变量“solution”未初始化,但我不知道如何修复它。我经常遇到这个问题,如果可能的话,我需要一个解释 问题#2:当我启动程序并输入我想玩的游戏数量时,它会忽略它并给我无尽的猜测,程序永远不会停止 谢谢 只需放置char solution='\0'。这足以摆脱警告 尝试打印刚刚在scanf()函数中读取的numgames的值。看起来你因为某种原因得到了一些无效的值 Upd:我知道你的问题了:你正在从PlayGuess()调用GetLetter();您正在从Get
char solution='\0'代码>。这足以摆脱警告
scanf()
函数中读取的numgames
的值。看起来你因为某种原因得到了一些无效的值Upd:我知道你的问题了:你正在从
PlayGuess()调用GetLetter()
;您正在从GetLetter()
调用CompareLetters()
;然后从CompareLetters()
调用GetLetter()
,从而创建无限递归。从CompareLetters()
中删除调用GetLetter()
在函数中使用它们之前,您必须初始化guess
和solution
这条线是什么
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#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)
{
GetLetter();
numGuesses = numGuesses + 1;
if (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 (guess<solution)
{
printf("The letter you are trying to guess comes after %c\n", guess);
printf("\nTry again\n");
GetLetter();
return 0;
}
else
if (guess>solution)
{ printf("The letter you are trying to guess comes before %c", guess);
printf("\nTry again\n");
GetLetter();
return 0;
}
}
指示,没有同名函数,也不是对任何函数的调用
对于虚拟初始化,您可以使用
int compareletter(char guess, char solution);
继续我的评论,代码中的关键要点是:(1)你不能通过反复猜测语法、编译来学习C,(2)通过检查所有输入函数的返回并验证你收到的值来验证程序的所有输入,(3)启用编译器警告,然后在再次尝试编译之前阅读、理解并更正每个警告,(4)在代码编译干净且没有警告之前,不要接受代码
由于您的代码包含#define(定义)CRT(安全)NO(无)警告
,显然您在windows上使用的是cl.exe
(从cmd.exe
或从VS code>)。要学习基本编程,请关闭VS代码,打开VS(或SDK)安装提供的命令行,在掌握从命令行编译并理解编译器选项之前,不要担心再次使用IDE。请参见,或在命令提示下键入cl/?
在命令行中,基本编译字符串应类似于:
solution = '\0';
(/W3
启用大多数警告,/Ox
启用所有优化)
我发现不要用.obj
和.exe
文件把我的c源代码目录弄得乱七八糟很有帮助,所以我为对象和可执行文件创建了两个额外的目录/obj
和/bin
。然后使用/Fo
和/Fe
选项告诉编译器将目标文件和exe文件放在适当的目录中,例如
cl.exe /nologo /W3 /Ox /Tc mysource.c
这将把mysource.obj
放在obj
目录中,mysource.exe
放在bin
目录中
在你坐在键盘后面开始啄食之前,你必须清楚你的代码逻辑。(请参见上面的:(1))。最简单的方法是为您的代码绘制一个简单的逻辑图,并确定您将在main()
中处理哪些值,然后在每个函数()中处理哪些值。你不需要任何花哨的东西,一张8.5x11的纸和铅笔就可以了。在明确了代码的每一部分将要做什么之后,坐下来开始分秒必争
通过测试这种逻辑,您可以重新编写代码,使其比当前更有意义,例如
cl /nologo /W3 /Ox /Foobj/mysource /Febin/mysource /Tc mysource.c
示例使用/输出
>cl /nologo /W3 /Ox /Foobj/guessletter /Febin/guessletter /Tc guessletter.c
注意:对于ASCII字符,第6位为“大小写位”,如果是1
,则字符为小写,0
大写tolower
可以简单地写为:
/* 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;
}
unsigned c_tolower(unsigned c)
{
如果('A'在调用int compareletter(char guess,char solution);
时,char solution的值是多少?);调用fscanf(inp,%c,&solution)之前,如何处理stdin中的;
?我认为char解决方案在int comparelet中没有价值
> 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'!
/* 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;
}
unsigned c_tolower (unsigned c)
{
if ('A' <= c && c <= 'Z')
c ^= (1 << 5);
return c;
}