-3

如何在 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;
}
4

3 回答 3

1

我看到一些可能的问题:

printf("你好 %s,你准备好你的旅程了吗?\n",name); scanf("%c",选择);

1) Scanf 需要地址来存储扫描的输入,并且由于您已经指定了数组,因此将数组名称作为参数适用于 'name',它有 20 个字符的空间(请记住 C 使用 NULL ('\0')字符来标记字符串的结尾)。给出数组名称会产生数组开头的地址,这是您想要的,但您将“选择”声明为一个字符的数组。它不能保存任何非空字符串,因为终止的 '\0' 填充了数组。我建议只使用 char 并给 'scanf' 它的地址,因此:

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

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

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

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

顺便说一句,当您测试大量字符时,func 的 'toupper(int c) 和 tolower(int c) 可以节省打字:(c=(char) tolower((int) c); if (c == 'y') ...else if (c == 'z') [etc.]您可能会在没有演员表的情况下过关)。

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

[编辑:]更进一步:如果您想循环直到获得有效输入,您需要执行以下操作:

...
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 */  
}  

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

于 2013-02-03T03:49:46.963 回答
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;
}
于 2013-02-03T10:58:52.317 回答
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);
}
于 2013-02-03T03:08:18.300 回答