C

时间:2015-10-20 20:34:34

标签: c loops while-loop

此程序中的循环无法正常工作:

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陈述。

我希望程序在循环的底部等待输入,并且要么退出循环,要么根据该输入继续循环。为什么不这样做?

4 个答案:

答案 0 :(得分:5)

  1. 如果输入一个字符,则隐式输入另一个字符:换行符,这部分会导致奇怪的行为。将格式字符串"%c"替换为"%c%*c"

  2. 可以忽略此问题
  3. 您检查'y'两次。将第二个'y'替换为'n'

  4. 不会影响计划的操作,但可能会提高效果:将第二个if替换为else if。如果第一个if子句的计算结果为真,那么这将使程序甚至不测试第二个y子句的条件。

  5. 您不会检查除nelse之外的其他字符。要么添加单独的if,要么添加第3个else替换CREATE TABLE <table_name> AS ( SELEC * FROM myview ) 1

  6. 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;
}