跳过for循环的一次迭代

时间:2018-11-02 16:26:04

标签: c

代码和输出都附上了。

基本上,这是第二次跳过我的输入。就像我启动代码一样,它允许我输入一个选项,然后第二次跳过输入,只是转到开关的默认情况。

然后第三次允许我输入。不知道为什么。

任何帮助将不胜感激。

哦,这是一个赋值,所以我必须将输入包含在menu()原型内,并且必须使用开关在main中求值。

#include <stdio.h>
#include <unistd.h>

char menu(void);

int main(void){
    int a;
    char op;
    for (a = 1; a != 0;) {
        op = menu();
        switch (op) {
            case 'a':
                printf("youre in a\n\n");
                break;
            case 'e':
                printf("youre in e\n\n");
                break;
            case 'p':
                printf("youre in p\n\n");
                break;
            case 's':
                printf("youre is s\n\n");
                break;
            case 'm':
                printf("youre in m\n\n");
                break;
            case 'x':
                printf("youre in x\n\n");
                a = 0;
                break;
            default:
                printf("Invalid entry. Please choose valid option.\n\n");
                break;
        }//end switch
    }//end while
    return 0;
}//end main

//menu prototype
char menu(void){
    char option;
    printf("-------------------------------");
    printf("\nWelcome To Virtual Art Gallery");
    printf("\n-------------------------------");
    printf("\nMenu - Select on of the following options:");
    printf("\npress 'a': To add a painting");
    printf("\npress 'e': To erase a painting");
    printf("\npress 'p': To print data for all paintings");
    printf("\npress 's': To print data for special paintings");
    printf("\npress 'm': To modify data for a painting");
    printf("\npress 'x': To exit the program");
    printf("\noption: ? ");
    option = getchar();
    return option;
}//end menu()

Here's the output that I am getting

1 个答案:

答案 0 :(得分:1)

如果您在致电op = menu()中的main之后添加以下行:

    printf("op = \'%c\'\n", op);

您会注意到op实际上是大多数输入的换行符。这是因为getchar正在stdin中使用潜在的换行符,而不是您实际输入的字符。

一些解决方法:

  1. 在循环中使用getchar,该循环会首先删除所有换行符:

    do
    {
        option = getchar();
    }
    while(isspace(option));
    
  2. scanf格式说明符之前的空格中使用"%c"

    scanf(" %c", &option);
    

    scanf格式字符串前的单个空格将自动消耗stdin中任何潜在的换行符。