C 在if-else中相互比较时,字符如何存储值?

C 在if-else中相互比较时,字符如何存储值?,c,C,我正在创建一个循环,基本上有一个y/n yes,no答案,我想在do while循环中使用if-else。当使用input==Y时,它似乎不接受它,所以我想知道这在C语言中是否可能?或者如果我走错路了 我只尝试了一个简单的if-input==Y,但不起作用,然后我尝试了一个strcmp,但似乎也不起作用。我在strcmp部分,因为我想我可能已经接近答案了,但我不完全确定我是否理解char值的情况 printf("Would you like to print another invoice? Y

我正在创建一个循环,基本上有一个y/n yes,no答案,我想在do while循环中使用if-else。当使用input==Y时,它似乎不接受它,所以我想知道这在C语言中是否可能?或者如果我走错路了

我只尝试了一个简单的if-input==Y,但不起作用,然后我尝试了一个strcmp,但似乎也不起作用。我在strcmp部分,因为我想我可能已经接近答案了,但我不完全确定我是否理解char值的情况

printf("Would you like to print another invoice? Y=yes, N=No\n");
do {
    scanf("%s", &newInvoice);
    if(strcmp(newInvoice, Y)!= 0) {
        main();
    }
    else if(strcmp(newInvoice, N)!= 0) {
        printf("Goodbye!\n");
    }
    else {
        printf("Invalid Entry (it has to be y or n):\n");
    }
} while(strcmp(newInvoice, N)!= 0); 

当我刚刚输入==Y时,它希望我初始化Ym和N,所以这似乎不是答案。我希望循环重复问题和输入,直到他们说是或否;如果他们输入G或其他任何字符,它需要再次循环。

请考虑以下更改abelenky的代码。下面的文字确保小写字母被接受,但它可能有点笨重,并且可能表现得更优雅一些

int main()
{
    char newInvoice, buffer;
    do 
    {
        newInvoice = getchar();
        bufferClean(&buffer); //see underneath the code for the explanation.
        if (newInvoice == 'Y' || newInvoice == 'y') 
        {
            printf("you've chosen YES, continue ......\n");
            break; // breaks the loop and continues with the code.
        }
        else if (newInvoice == 'N' || newInvoice == 'n') 
        {
            printf("you've chosen NO, Goodbye!\n");
            return 1; //main returns 1 and ends the program
        }
        else 
        {
            printf("Invalid Entry (it has to be y or n):\n");
        }
    } while(1);

    printf("exited the loop\n");
    return 0;
}
此外,询问用户的输入也有点棘手。我建议在使用后清除缓冲区,因为它会传递换行符,并且可能会跳过任何进一步的输入提示。 为此,我创建了一个小函数:

void bufferClean(char *buff)
{
    while ((*buff = getchar()) != '\n' && *buff != EOF);
}

只需在main中声明一个没有值的char缓冲区,并在每次需要清除缓冲区时将其传递给函数,我在每次请求用户输入后都会这样做。我是新手,如果我犯了什么错误,请指出

注意:你不应该调用main,你可能要把NeX发票与Y和N的变量进行比较,而不是变量Y和N,在这种情况下,如果NealCudio= = 'Y'应该做这个工作。C++中递归调用main是合法的,但是C++中是非法的。这从来都不是个好主意,however@bruceg我原以为newInvoice是一个字符,但现在我在scanf中看到了%s,您可能是对的。如果没有看到newInvoice的声明,我们可能无法确定。递归调用main可能不是一个好主意。你应该循环,而不是递归。此外,由于您还没有说明任何变量是如何定义的,也没有说明大多数变量是如何初始化的,因此很难确定任何事情。您应该检查scanf是否返回1;如果不是,则表示出现EOF或其他错误情况。最好希望用户永远不要输入多个字符。它实际上只根据调试器循环并保存一个字符,然后覆盖旧的字符,除非它实际访问更多内存,并且不会在调试器中显示,从而导致未定义的行为?但是是的,我确实建议使用getchar;。我个人不会使用单元素数组,这只是为了本例的目的,因为作者使用了字符串。你误解了调试器。scanf将读取无限数量的字符,直到第一个空格。由于您的数组只有一个字符长,如果用户输入多个字符,那么它将丢弃堆栈并生成UB。我知道这只是一个例子,但你不应该教坏习惯。有多种方法可以解决这个问题,而不会破坏堆栈。谢谢您的解释,Carey。请查看上面编辑的代码。经过测试,任何输入都可以正常工作,希望不会再弄乱堆栈!更好的解决方案。