我想要比较一些字符串,但不幸的是我找不到任何合适的方法。
背后的想法是要求键盘输入,读取一个变量,一个符号,如果它是"y“或"n”(显然是“yes”或"no“),它就会执行某些活动。如果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;
}这实际上工作得很好,但如果我不按'y‘或'n',"while“就会再次开始,并且由于我不能理解的原因,"printf”会比输入的长度多执行一倍。因此,如果我们运行此代码并应用"asdf“作为输入(四个符号),则"while”中的"printf“将显示五次(四加一)。结果是:
Question? (y/n)
Question? (y/n)
Question? (y/n)
Question? (y/n)
Question? (y/n)其他东西在我的代码中都运行得很好,但是这个...显然,这不是最好的方法。我也尝试过"strcmp()":
#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;
}我不知道为什么,程序甚至都不能启动。很明显,我没有正确地实现"strcmp“,我不明白哪里出了问题。
有什么想法吗,我应该怎么做,这样我才能避免在"while“中多次执行"printf”,或者让"strcmp“以我所要求的方式工作?
发布于 2017-11-20 04:19:46
您可能希望阅读整行代码,并将其作为一个整体进行解释。这样,当您输入包含多个字符的行时,就不会得到额外的不需要的迭代,也不会得到换行符的额外迭代。看看fgets()函数。
除了非常简单的输入需求之外,scanf()通常是一个糟糕的选择,因为它有点模糊,并且不允许您在解析输入之前验证输入的各个部分。
发布于 2017-11-20 04:21:54
scanf的%c格式说明符将读取任何字符,包括空格字符,如换行符。
因此,如果您输入一个字母并按enter键,scanf将读取该字母并返回,将换行符留在输入缓冲区中。在循环的下一次迭代中,scanf将立即使用缓冲区中剩余的换行符,而answer将包含换行符。这就是为什么会打印两次提示符的原因。
您需要在scanf格式中添加前导空格:
scanf(" %c",&answer);该空格将使用输入的任何空格字符,以便answer仅包含非空格。
使用strcmp出现问题的原因是,您实际上不是在比较字符串,而是在比较单个字符。strcmp的每个参数都应该是指向包含字符串的字符数组的指针。相反,您传入的是单个字符。然后,该字符的值被解释为地址并解除引用。这会调用未定义的行为。
发布于 2017-11-20 04:13:48
在C中,字符串文字是这样表示的:"n",但您有字符文字,'n' ...它们是非常不同的。使用字符串字面值作为参数,它应该能更好地工作。
https://stackoverflow.com/questions/47381508
复制相似问题