Strcmp()在“中”;“系列”;

Strcmp()在“中”;“系列”;,c,series,strcmp,C,Series,Strcmp,我想比较一些字符串,但不幸的是,我没有找到任何合适的方法 背后的想法是要求键盘输入,读取一个变量和一个符号,如果是“y”或“n”(“显然是”或“否”),则执行某些活动。如果char的值不是它们中的任何一个,则会再次询问该问题,直到未按下“y”或“n”为止。我不知道该如何实现这一点 #include <stdio.h> #include <string.h> int main() { char answer; answer='a'; while

我想比较一些字符串,但不幸的是,我没有找到任何合适的方法

背后的想法是要求键盘输入,读取一个变量和一个符号,如果是“y”或“n”(“显然是”或“否”),则执行某些活动。如果char的值不是它们中的任何一个,则会再次询问该问题,直到未按下“y”或“n”为止。我不知道该如何实现这一点

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

int main()
{
    char answer;

    answer='a';

    while (answer!='n'&&answer!='y')

    {

        printf("\nQuestion? (y/n) ");
        scanf("%c",&answer);

    }

    return 0;
}
在我的代码中,其他一切都非常好,但是这个。。。显然,这不是最好的方法。我也试过“strcmp()”:

#包括
#包括
int main()
{
char-answer='a';
while(strcmp(answer,'n')!=0和strcmp(answer,'y')!=0)
{
printf(“问题?”);
scanf(“%c”和“应答”);
}
返回0;
}
我不知道为什么,但节目还没开始。很明显,我没有正确地实施“strcmp”,我不明白哪里出了问题


任何想法,我应该怎么做,这样我就可以避免在“while”中多次执行“printf”,或者让“strcmp”按我要求的方式工作?

在C中,字符串文字是这样表示的:
“n”
,但您有字符文字,
'n'
。。。他们非常不同。在参数中使用字符串文字,这样会更好。

您可能希望阅读整行文字,并将其作为一个整体进行解释。这样,当您输入包含多个字符的行时,您就不会得到额外的不需要的迭代,换行符也不会得到额外的迭代。查看
fgets()
函数


除了非常简单的输入要求外,
scanf()
通常是一个糟糕的选择,这正是因为它有点模糊,不允许您在解析输入之前验证部分。
scanf
%c
格式说明符将读取任何字符,包括换行符等空白字符

因此,如果您输入一个字母并按enter键,
scanf
将读取该字母并返回,将换行符保留在输入缓冲区中。在循环的下一次迭代中,
scanf
将立即使用缓冲区中剩余的换行符,
answer
将包含换行符。这就是为什么你会看到提示被打印了两次

您需要在
scanf
格式中添加前导空格:

scanf(" %c",&answer);
空格将使用输入的所有空白字符,因此
answer
将只包含非空白字符


您在使用strcmp时遇到问题的原因是,您实际上并没有比较字符串,而是比较单个字符。
strcmp
的每个参数都应该是指向包含字符串的字符数组的指针。相反,您传递的是单个字符。然后将该字符的值解释为地址并取消引用。这会调用未定义的行为。

您是否有可能键入asdf+'enter'?是的。老实说,我不知道其他方法来应用我的输入。enter是由
scanf
使用的。这就是为什么额外的迭代“enter”键被视为scanf的一个字符。只读取一个键而不输入取决于您的操作系统,请查找类似kbhit()和getkey()的内容。或者测试答案=='\n'并忽略它。
scanf(“%c”,&answer)尝试此操作…这将确保
\n
被使用。在第一个示例中,海报使用字符-尽管在第二个示例中,如果我理解正确,它们确实需要是字符串,请按照您的建议替换每个“with”。不幸的是,两个发布的脚本都没有不同的效果。完全相同的情况发生了:(感谢您的回复@Dolda2000。我已经用fgets(answer,1,stdin)替换了scanf(“%c”,&answer),程序甚至没有启动。用fgets(answer,2,stdin)替换会导致程序在我输入符号后崩溃:(首先,
answer
在您的例子中是一个字符,而不是指针,因此如果有任何问题,它应该是
&answer
,而不仅仅是
answer
。但是,为了读取整行,您肯定需要一个比一个字符更大的缓冲区。@eccleiastes:另外,请注意,如果您在编译时使用了警告。)如果继续,编译器很可能会告诉您,
fgets(answer,1,stdin)
是错误的。“警告:传递'fgets'的参数1会从整数生成指针而不使用强制转换[默认情况下启用]”,“警告:赋值会从指针生成整数而不使用强制转换[默认情况下启用]”,您是正确的。
#include <stdio.h>
#include <string.h>

int main()
{
    char answer='a';

    while (strcmp(answer,'n')!=0&&strcmp(answer,'y')!=0)

    {

        printf("Question?");
        scanf("%c",&answer);

    }

    return 0;
}
scanf(" %c",&answer);