这个问题在这里已有答案:
我想比较一些字符串,但不幸的是我没有找到任何正确的方法来做到这一点 .
背后的想法是要求键盘输入,读取变量,一个符号,如果它是“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;
}
这实际上非常好用,但如果我不按'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”以我要求的方式工作?
3 回答
您可能想要读取整行,并将其解释为整体 . 这样,当您输入包含多个字符的行时,您不会获得额外的不需要的迭代,也不会为换行符添加额外的迭代 . 看看
fgets()
函数 .除了非常简单的输入要求之外,
scanf()
通常是一个糟糕的选择,正是因为它有些模糊,并且在解析之前不允许您验证部分输入 .scanf
的%c
格式说明符将读取任何字符,包括空格字符(如换行符) .因此,如果您输入一个字母并按ENTER键,
scanf
将读取该字母并返回,将换行符保留在输入缓冲区中 . 在循环的下一次迭代中,scanf
将立即消耗缓冲区中剩余的换行符,answer
将包含换行符 . 's why you'看到提示打印两次 .您需要以
scanf
格式添加前导空格:该空间将使用输入的任何空白字符,以便
answer
仅包含非空格 .您遇到
strcmp
问题的原因是因为您实际上并不比较字符串而是单个字符 .strcmp
的每个参数都应该是指向包含字符串的字符数组的指针 . 相反,你传递的是一个角色 . 然后将该字符的值解释为地址并取消引用 . 这会调用未定义的行为 .在C中,字符串文字以这种方式表示:
"n"
,但是你有字面文字,'n'
......它们非常不同 . 对参数使用字符串文字,它应该更好 .