C语言中的switch语句

3

我是C语言编程的新手,关于Switch语句有一个简短的问题。 我有一个菜单,呈现了一系列选项:

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

#define MAX 100

struct Video { 
char name[1024];        // Yvideo name
int ranking;                // Number of viewer hits
char url[1024];             // YouTube URL
};

struct Video Collection[MAX];

int tail = 0;

//-- Forward Declaration --// 
void printall();
void insertion();
void savequit();
void load();
void branching(char);
void menu(); 
int main()
{
char ch; 

load();     // load save data from file

printf("\n\nWelcome\n");

do {
    menu();
    fflush(stdin);            // Flush the standard input buffer 
    ch = tolower(getchar()); // read a char, convert to lower case
    branching(ch);
} while (ch != 'q');

return 0; 
}
void menu()
{
    printf("\nMenu Options\n");
printf("------------------------------------------------------\n");
    printf("i: Insert a new favorite\n");
    printf("p: Review your list\n"); 
    printf("q: Save and quit\n");
    printf("\n\nPlease enter a choice (i, p, or q) ---> "); 
}

void branching(char option)
{
switch(option)
{
    case 'i':
        insertion();
        break;

    case 'p':
        printall();
        break;

    case 'q':
        savequit();
        break;

    default:
        printf("\nError: Invalid Input.  Please try again..."); 
        break;
}
}

到目前为止,输入“i”(用于插入新条目)和“q”(用于保存并退出)都能完美地工作。但是每次我输入“p”时,都会得到默认情况(错误:无效输入。请再试一次……)。我做错了什么?我相信switch的语法是正确的?我尝试将“p”更改为其他字母,但我仍然得到默认情况。如果有帮助的话,这是我的printall()方法...

void printall()
{
int i; 

printf("\nCollections: \n"); 

for(i = 0; i < tail; i++)
{
    printf("\nName: %s", Collection[i].name);
    printf("\nRanking (Hits): %d", Collection[i].ranking);
    printf("\nURL: %s", Collection[i].url);
    printf("\n");
}
}

你在 main 函数上方是否有被调用函数的函数原型? - Seth Carnegie
3
清空stdin的fflush是未定义行为,这可能是问题所在。 - Simone-Cu
3个回答

3
有没有类似这样的东西:
char b[5];
do {
    menu();
    if(fgets(b,5,stdin)==NULL)
        return -1;

    ch = tolower(b[0]); // read a char, convert to lower case
    while(strlen(b)>=4&&b[3]!='\n'){
         check=fgets(b,5,stdin);
         if(check==NULL)
            return -1;
    }

    branching(ch);
} while (ch != 'q');

不行,即使在运行程序后选择的是第一个选项,我仍然得到默认情况。:( - accraze
好的,在我的电脑上它可以工作(当输入少于3个字符时)。在 while 循环之前,我们可能需要清空输入缓冲区。让我检查一下。 - Simone-Cu
1
@SunHypnotic,你能发布一下插入代码吗?我猜问题就出在那里。 - P.P
好的 http://9gag.com/gag/5450811?ref=fb.s :D 我添加了一段代码来检测用户是否添加了太多字符(永远不要相信用户:D),以此来清除缓冲区。希望它能正常工作 :) - Simone-Cu

3
你可以在默认情况下输出无效字符。这可能有助于你理解如何处理输入。
default:
    printf("\nError: Invalid Input ('%c').  Please try again...", option); 
    break;

2

fflush(stdin)是未定义的,因为fflush仅用于输出流。要清除换行符,您可以简单地使用另一个getchar()。

尝试使用以下代码来替换循环部分:

do {
    menu();
    ch = tolower((unsigned char)getchar());
    getchar();
    branching(ch);
} while (ch != 'q');

这个在我只是浏览菜单时有效...但是在我插入一个新条目到我的列表中(其中包括2个字符数组和1个整数)并选择'p'来打印所有内容之后,我得到了相同的错误...现在我无法选择任何菜单选项而不会得到默认情况... - accraze
我的猜测是你在insert中以相同的方式读取输入,这会使得\n留在输入缓冲区中。将你的insert更改为以下内容。 - P.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接