在文本冒险中为用户提供“是或否”选择?

时间:2013-02-03 03:03:42

标签: c user-input

如何在C中提出是或否的问题?

代码应该取用户名并使其成为一个字符串(有效)。然后它继续并询问用户他们是否已准备好开始他们的旅程(这将是一个简单的文本冒险游戏)。

遗憾的是,这不起作用。我不能问一个是/否的问题,因为我不知道怎么做。谷歌搜索和搜索StackOverflow也没有帮助我。

这就是我到目前为止:

#include <stdio.h>

int main()
{

/*This declares the strings*/

char name[20];
char yesno[3];
char choice[1];

/*This tells the user that they should only use Y/N when responding to Yes or No questions.*/

printf("When responding to Yes or No questions use Y/N.\n");

/*This asks the user what their name is and allows the program to use it as a string for the rest of the program*/  

printf("Hello! What is your name?\n");
scanf("%s",name);

printf("Hello %s, are you ready for your journey?\n",name);
scanf("%c",choice);


char choice, 'Y';
while (choice != 'N' && choice == 'Y')
    {
        printf("Okay!Let's continue %s.\n",name);
    }
char choice,'N';
while (choice != 'Y' && choice == 'N')
    {
        printf("Goodbye.\n");
    }


return 0;
}

3 个答案:

答案 0 :(得分:1)

char[80] choice;
fgets(choice, sizeof(choice), stdin);

if (choice[0] == 'Y' || choice[0] == 'y')
{
    printf("Okay!Let's continue %s.\n",name);
}
else
{
    printf("Goodbye.\n");
    exit(0);
}

答案 1 :(得分:1)

我看到了一些可能的问题:

  

printf(“Hello%s,你准备好了吗?\ n”,姓名);   的scanf( “%C”,选择);

1)Scanf需要地址来存储扫描输入,&amp;因为你已经指定了数组,所以给出数组名作为参数适用于'name',它有20个字符的空间(记住C使用NULL('\ 0')字符来标记字符串的结尾)。给出数组名称可以生成所需数组开头的addr,但是您将'choice'声明为一个char的数组。它不能保存任何非空字符串,因为终止'\ 0'填充数组。我建议只使用char&amp;给'scanf'它的地址,因此:

char choice;
...
scanf("%c", &choice);
...
if (choice=='Y' [etc.]

如果您只是必须使用数组,请记住'choice'给出第一个元素的地址,因此要测试char,您需要'* choice'或'choice [0]' (他们是一样的)。

所以:... if (*choice == 'y' || *choice == 'Y')...

或:... if (choice[0] ...

BTW the func的'toupper(int c)&amp;当你测试很多字符时,tolower(int c)可以节省输入:c=(char) tolower((int) c); if (c == 'y') ...else if (c == 'z') [etc.](你可以在没有演员表的情况下通过)。

- 此外,当有人输入的名称长度超过19个字符时,scanf会将其存储在name数组后的内存中,可能会删除其他一些数据。实际上这可能是你的问题。使用scanf("%19s", name)将解决此问题(您还应确保yesno获得@最多两个字符。)

[edit:]进一步说明:如果你想循环直到得到有效的输入,你需要做类似的事情:

...
printf("Are you truly ready to embark on your journey (y/n)? ");  
scanf("%c", &choice); /* 'choice' defined as char, not vector */  
while (!strchr("nNyY", choice)) { /* bad input, reprompt */  
    printf("Please enter either 'y' or 'n': ");  
    scanf("%c", &choice);  
}  
if (choice=='y' || choice=='Y') {  
    printf("Well met, %s, thou brave soul!\n", name);  
    /* etc. */  
}  
else {  
    printf("Goodbye!\n");  
    /* etc */  
}  

我承认我没有测试过这段代码,但这是我开始的地方。希望它有所帮助...
问候, 编

答案 2 :(得分:1)

#include <stdio.h>
#include <string.h>

int letterinput(const char *validchars) {
    int ch;
    do ch = getchar(); while ((ch != EOF) && !strchr(validchars, ch));
    return ch;
}

int main(void) {
    int x;
    printf("Enter Y/N: ");
    fflush(stdout);
    x = letterinput("nNyY");
    if (x != EOF) {
        if ((x == 'y') || (x == 'Y')) {
            printf("YES!\n");
        } else {
            printf("no :(\n");
        }
    } else {
        printf("You didn't answer\n");
    }
    return 0;
}