这个功能非常简单,或者至少它应该是。一些背景:我正在构建一个国际象棋程序,并且此函数运行以将促销值分配给已到达表末尾的典当。这只是阅读促销请求的功能;检测和实际推广高出一倍。这是代码:
char promote (int player)
{
char req, out;
req = '0'; //shouldn't be necessary, and should be overwritten by scanf
out = '0'; //just in case, should be overwritten
printf("What piece would you like to promote to? (Q/N/R/B) \n");
scanf("%c", &req);
if (req == 'q' || req == 'Q')
{
out = 'q';
}
else if (req == 'r' || req == 'R')
{
out = 'r';
}
else if (req == 'n' || req == 'N')
{
out = 'n';
}
else if (req == 'b' || req == 'B')
{
out = 'i';
}
else if (req != 'q' && req != 'Q' && req != 'r' && req != 'R' && req != 'n' && req != 'N' && req != 'b' && req != 'B')
{
printf("req: %c, out: %c \n", req, out); //to test variable values
printf("That character is invalid. Please enter another.\n");
return promote(player);
} //a simple else should suffice here. I put in the else if as a possible fix via redundancy (didn't work)
if(player == 2)
{
out = toupper(out); //designates team by case
}
printf("Returning %c\n", out); //test out value again
return out;
}
应该发生什么:Fxn扫描单字符输入,将其分配给req,检查req对8种可能的选择。如果它适合四个箱中的一个,它将四个值之一分配出来;如果没有,它会打印一个简单的错误消息并返回自己的调用,此时它会扫描等等。
发生了什么:当被调用时,scanf读取\ n(自动),并立即回送错误消息并自行循环而无需等待输入。在第二个循环中,它运行正常,但有一点需要注意:当我输入一个无效字符时,它会返回正确的错误消息,并在再次调用自身时,在再次工作之前经历一个读取\ n的循环。建议函数本身,而不是错误消息,是责任。
输出:
You can now promote your pawn. What piece would you like to promote to? (Q/N/R/B)
req:
, out: 0
That character is invalid. Please enter another.
What piece would you like to promote to? (Q/N/R/B)
q
Returning q
有什么想法吗?我已经尝试了十几种不同的东西来解决这个问题,而且没有一个能够解决这个问题。可能非常简单,就像我的所有重大错误一样。谢谢你的帮助!
答案 0 :(得分:0)
看起来scanf
正在读取换行符,可能来自之前的输入。要解决此问题,您只需循环scanf
,直到得到不是空白的内容:
do {
scanf("%c", &req);
} while(isspace(req));
另外,您可以使用tolower
将字符转换为小写,这样可以简化您的req
测试。