对这个简单函数的行为感到困惑

时间:2014-03-24 19:59:01

标签: chess

这个功能非常简单,或者至少它应该是。一些背景:我正在构建一个国际象棋程序,并且此函数运行以将促销值分配给已到达表末尾的典当。这只是阅读促销请求的功能;检测和实际推广高出一倍。这是代码:

    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

有什么想法吗?我已经尝试了十几种不同的东西来解决这个问题,而且没有一个能够解决这个问题。可能非常简单,就像我的所有重大错误一样。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

看起来scanf正在读取换行符,可能来自之前的输入。要解决此问题,您只需循环scanf,直到得到不是空白的内容:

do {
    scanf("%c", &req);
} while(isspace(req));

另外,您可以使用tolower将字符转换为小写,这样可以简化您的req测试。