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」と入力するたびに、デフォルトのケースが表示されます。(エラー:入力が無効です。もう一度やり直してください...)。私が間違っているのは何ですか?スイッチの構文は正しいと思いますか?'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");
}
}
4

3 に答える 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');
于 2012-09-29T16:42:53.380 に答える
3

デフォルトの場合、無効な文字を出力できます。これは、入力がどのように処理されるかを理解するのに役立つ場合があります。

default:
    printf("\nError: Invalid Input ('%c').  Please try again...", option); 
    break;
于 2012-09-29T16:54:43.303 に答える
2

fflush(stdin)fflushは出力ストリームに対してのみ定義されるため、は未定義です。改行文字をクリアするには、別のgetchar()を使用するだけです。

ループ部分でこれを試してください:

do {
    menu();
    ch = tolower((unsigned char)getchar());
    getchar();
    branching(ch);
} while (ch != 'q');
于 2012-09-29T16:27:51.840 に答える