1

好吧,我有一个实验室要做功课,我想知道是否有人可以帮助我解决这个问题。程序一直说我的变量已损坏。如果有人可以帮助我,那就太好了。顺便说一句,不介意这些问题哈哈。

int main (void)
{
char answer;

printf("welcome to the celebrity look alike game. You will be asked 5 yes or no questions. To answer please either put a y for yes or an n for no");
printf("\nQuestion 1: Do you have brown eyes?");
scanf("%1s", &answer);
if (answer=='y')
    {printf("\nQuestion 2:Do you have white hair?");
    scanf("%1s", &answer);
    if (answer=='y')
        printf("\nQuestion 3:Is your height around 5 feet 10 inches?");
        scanf("%1s", &answer);
        if (answer=='y')
            printf("\nQuestion 4:Are you a slim man?");
            scanf("%1s", &answer);
            if (answer=='y')
                printf("\nQuestion 5: Do you dress well?");
                scanf("%1s", &answer);
                if (answer=='y');
                    printf("You really look like Matt Leblanc!");}
else printf("Sorry, you do not look like this celebrity.");

return 0;
}
4

3 回答 3

2

问题是它answer属于 datatype char,但scanf()被告知将其视为长度为(至少)2的字符数组。这会导致scanf()将变量写入内存中发生的任何事情。在这种情况下,没有其他变量可以乱写,它可能正在破坏程序的堆栈。

有几种方法可以解决这个问题。

代码还有其他几个问题:

  • if..then..else 结构有缺陷。除非除最后一个之外的所有条件都为真,否则它不会显示“看起来不像这个名人”消息。
  • 缩进不决定语句嵌套。您必须显式使用花括号对语句进行分组。
  • 为了以可预测的方式处理用户输入,您可能希望坚持让他们使用yor来回答n。在编写程序时,它将接受X7作为“否”的同义词。
于 2012-06-04T01:27:49.140 回答
1

您需要更改scanf("%1s", &answer);scanf("%c", &answer);. 前者会尝试读取一个字符串,这需要两个字符——一个读取字符和一个空字符来终止字符串。后者只是读取一个字符。

因为answer只有一个字符读取一个字符串会破坏您的记忆。

于 2012-06-04T01:29:01.373 回答
0

我认为问题在于您使用scanf如下:

scanf("%1s", &answer);

虽然您的变量answer只是一个char. 请记住,C 字符串总是以空字符终止,因此只有一个字符的字符串需要存储两个字符——字符本身和空终止符。因此,当您尝试将该字符串存储在单个字符中时,您最终会在char变量之后立即丢弃内存,因为scanf试图在其中放置一个空字符。

要解决此问题,请更改您的声明为answerchar answer[2]或更改您的scanf,以便您阅读单个字符:

scanf("%c", &answer);

或者使用getchar().

希望这可以帮助!

于 2012-06-04T01:27:57.663 回答