我正在学习c语言,并且理解这种语言是低级的,在这种情况下缺乏异常处理。
我做了一个简单的程序,用户从菜单中选择一些选项。就这么简单!
程序分为几个方法-其中一个方法等待用户按键-需要整数。然后将此整数返回到另一个包含开关结构的方法。
当一个字符被按下时,问题就出现了——在大多数情况下,else块的无限循环被启动。
您必须选择另一个0-2。请再试一次:-)
您必须选择另一个0-2。请再试一次:-)
您必须选择另一个0-2。请再试一次:-)
...... 等等
我真的不知道怎么解决这个问题。我试图使用scanf函数的返回值,但没有成功。我还试图将一个字符(而不是整数)作为参数传递给scanf函数,但也没有成功。
有什么解决这个问题的建议吗?

#include <stdio.h>
#include <stdlib.h>

void menu();
void runSelection(int selection);
int getSelection();
int pause();


int main(void) {

do{
    menu();
    runSelection(getSelection());
}while(pause());

return 0;
}

int pause() {
int c;
printf("\n\nPress enter to continue!");
fflush(stdout);
/* flush inputstream */
while((c = getchar()) != '\n' && c != EOF);
getchar();
return 1;

}

void menu() {

puts(" * * * * * *   M E N U  * * * * * * *");
puts("1. Do something 1");
puts("2. Do something 2");
puts("3. Do something 3");
fflush(stdout);
}

void runSelection(int selection) {

switch (selection) {
    case 0:
        puts("you pressed 0");
        break;
    case 1:
        puts("you pressed 1");
        break;
    case 2:
        puts("you pressed 2");
        break;
}
}

int getSelection() {

int key;
int true = 0;
do {

    scanf("%d", &key);

    if (key >= 0 && key <=2) {
        true = 1;
    }
    else {
        puts("You must choose an alternative 0 - 2. Please try again :-)");
        fflush(stdout);
    }

} while (true == 0);

return key;
}

最佳答案

您得到了一个无限循环,因为扫描程序正在从输入缓冲区读取字符。缓冲区中还有一个剩余字符,换行符'\n'
使用以下宏而不是scanf directelly

#define SCAN_ONEENTRY_WITHCHECK(FORM,X,COND) \
do {\
    char tmp;\
    while(((scanf(" "FORM"%c",X,&tmp)!=2 || !isspace(tmp)) && !scanf("%*[^\n]"))\
            || !(COND)) {\
        printf("Invalid input, please enter again: ");\
    }\
} while(0)


int main()

{
    int decision;

    printf("Input data, valid choice 1 or 0: ");
    SCAN_ONEENTRY_WITHCHECK("%d",&decision,(decision==0 || decision==1));
    printf("You have entered good input : %d\n", decision);
}

以下主题包含有关此宏及其使用方法的说明:
Common macro to read input data and check its validity

关于c - 无限循环扫描功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19202197/

10-11 21:15