此程序中的循环无法正常工作:
int main() {
char userresponse;
char x;
do {
printf("are you human");
scanf("%c", &userresponse);
if (userresponse == 'y') {
printf("welcome");
}
if (userresponse == 'y') {
printf("please leave");
}
printf("type z to repeat");
scanf("%c", &x);
} while (x == 'z');
return 0;
}
它会“键入z重复”,然后结束。当我尝试定义char x='z';
时,程序第一次运行正常,但最后它会循环播放2到4次,显示所有printf
个消息,甚至是else
消息。 if
陈述。
我希望程序在循环的底部等待输入,并且要么退出循环,要么根据该输入继续循环。为什么不这样做?
答案 0 :(得分:5)
如果输入一个字符,则隐式输入另一个字符:换行符,这部分会导致奇怪的行为。将格式字符串"%c"
替换为"%c%*c"
。
您检查'y'
两次。将第二个'y'
替换为'n'
。
不会影响计划的操作,但可能会提高效果:将第二个if
替换为else if
。如果第一个if
子句的计算结果为真,那么这将使程序甚至不测试第二个y
子句的条件。
您不会检查除n
或else
之外的其他字符。要么添加单独的if
,要么添加第3个else
替换CREATE TABLE <table_name> AS (
SELEC *
FROM myview
)
1 。
1 正如@JonathanLeffler在对此答案的评论中提到的
答案 1 :(得分:4)
当您为y
键入userresponse
时,您可能必须在此之后点击Enter
,对吗?
Enter
算作一个特征!由于它没有存储在userresponse
中,因此它保留在输入缓冲区中。从输入缓冲区读取的下一行是scanf("%c",&x);
。因此,您最终会在Enter
变量中找到x
。
接下来,您描述了程序显示所有printf消息,甚至是其他消息,
您是否看到关键字else
在你的程序中?(因为我没有)
答案 2 :(得分:1)
但最后它会循环播放2到4次,显示所有printf消息,
有几种方法可以避免这种情况,一种是在scanf之后添加:
while((check=getchar()) != EOF && check != '\n');
最小代码的任何方式都是这样的:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char a;
int check,ok=0;
do {
printf("Give an A: ");
if ((scanf("%c",&a)) == 1){
while((check=getchar()) != EOF && check != '\n');
if ((a == 'a') || (a == 'A')){
printf("True\n");
ok=0;
} else {
printf("False\n");
ok = 1;
}
}else{
printf("Error");
exit(1);
}
}while (ok == 1);
return 0;
}
但是你如何处理这个问题,修复可能会是这样的:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char userresponse;
int check,ok=0;
char x;
do {
printf("are you human: ");
if ((scanf("%c",&userresponse)) == 1){
while((check=getchar()) != EOF && check != '\n');
if ((userresponse == 'y') || (userresponse == 'Y')){
printf("welcome\n");
break;
} else {
printf("please leave\n\n");
printf("type z to repeat");
if(scanf("%c",&x) == 1){
while((check=getchar()) != EOF && check != '\n');
if(x=='z' || x == 'Z'){
ok = 1;
}else{
printf("\n");
printf("Wrong Input\nGoodBye\n");
break;
}
}else{
break;
}
}
}else{
printf("Error");
exit(1);
}
}while (ok == 1);
return 0;
}
我在这里尝试解释的是,没有理由坚持使用x ==&#39; z&#39;之类的条件,只需使用上面示例中的其他变量。
试一试。
编辑:
如果您需要从代码开始,那么这是一个快速修复:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char userresponse;
char x;
do {
printf("are you human");
if(scanf(" %c", &userresponse) ==1){
if (userresponse == 'y' || userresponse == 'Y') {
printf("welcome\n");
}
printf("type z to repeat\n");
if(scanf(" %c", &x) != 1){
printf("Error");
exit(1);
}
}else{
printf("Error");
exit(1);
}
} while (x == 'z' || x == 'Z');
return 0;
}
正如您可能看到的那样,我尽量避免您的问题。 1)我检查scanf是否有错误
2)我在%c 前放置一个空格以避免&#39; \ n&#39;。
3)我检查y和Y以及z和Z.
答案 3 :(得分:0)
这很好用:
int main()
{
char userresponse;
char x;
do
{
printf("are you human");
scanf(" %c", &userresponse);
if (userresponse == 'y')
printf("welcome\n");
else
printf("please leave\n");
printf("type z to repeat");
scanf(" %c", &x);
}
while (x == 'z');
return 0;
}