2

私のプログラムには小さな問題があります。

2 または 3 または 4 を押すと正しく表示されますが、その後 a または b または c などを押すと、無効なオプションを出力する代わりに前の結果が表示されます。

どうすればこれを修正できますか?

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

    typedef struct vehicle
    {
    char name[100];
    char lice_no[25];
    int vehicle_type;
    char cmpny_name[100];
    int menu_year;
     }record;

    int main(void)
    {
    int i,choice;
    FILE *fp1,*fp2;
    char oname[100];
    record det,det1;
    int recsize;
    char c;

    fp1 = fopen("record.dat" , "r+");
    if(fp1 == NULL)
    {
        fp1 = fopen("record.dat" , "w+");
        if(fp1 == NULL)
        {
            printf("error in opening file : \n");
            return -1;
        }
    }
    recsize = sizeof(det);

    do
    {
        printf("\t\"enter the choice\"\n");

        printf("1 : adding the record\n");
        printf("2 : delete the record\n");
        printf("3 : editing the record\n");
        printf("4 : display the record\n");
        printf("5 : exit the program\n");


        fflush(stdin);
        scanf("%d" , &choice);
        scanf("%c" , &c);

        switch(choice)
        {
            case 1 :
            {
                    printf("In this add logic\n")
                break;
            }
            case 2 :
            {
                printf("In this case delete logic\n");
                break;
            }
            case 3 :
            {
                printf("In this case edit logic\n");
                                break;
            }
            case 4 :
            {
                printf("display logic\n");
                break;
            }
            case 5 :
            {
                printf("exit logic\n");
                break;
            }
            default :
            {
                printf("\"Invalid option\"\n");
                break;
            }
        }
    }
    while(1);
    return 0;
}
4

4 に答える 4

2

うーん、コードで間違っていることの1つは次のとおりです。

scanf("%c" , &c);

これは、scanf 関数では、文字をそれぞれの変数に格納する前にユーザーが Enter キーを押す必要があるためです。

したがって、コンパイラが次の行を読み取る場合:

scanf("%c" , &c);

入力、PLUS、ENTERを読み取ります。
したがって、scanf 関数に、入力 PLUS、ENTER を文字変数に格納するように強制します。

scanf() 関数を使用する代わりに getche() または getch() を使用する方がよいでしょう。使用しないでください:

scanf("%c" , &c);

エラーが発生するためです。


getche() または getch() 関数の使用例:

c=getche(); //waits for a keypress and stores it on a variable
c=getch();  //waits for a keypress and stores it on a variable

2 つの違いは、getche() はキー入力を表示するのに対し、getch() は表示しないことです。


注:忘れずに入れましょう

#include<conio.h>

追加情報: それでも scanf() 関数を使用したい場合は、お気に入りの変数を次のように宣言してください。

char c[20];

次に、次を使用できます。

scanf("%s", &c);

ただし、変数は、文字配列で宣言したように、最大​​ 19 文字しか保持できません。

そして要約は使用しないでください:

scanf("%c", &c);

他の scanf() 関数に影響を与える可能性があるためです。:)


解決策 (ネタバレ注意):

#include <stdio.h>
#include <string.h>
#include <conio.h>

typedef struct vehicle
{
    char name[100];
    char lice_no[25];
    int vehicle_type;
    char cmpny_name[100];
    int menu_year;
}record;

int main(void)
{
    int i; //removed choice from int
    FILE *fp1,*fp2;
    char oname[100];
    record det,det1;
    char choice; //made the variable choice a character
    int recsize;
    char c;

fp1 = fopen("record.dat" , "r+");
if(fp1 == NULL)
{
    fp1 = fopen("record.dat" , "w+");
    if(fp1 == NULL)
    {
        printf("error in opening file : \n");
        return -1;
    }
}
recsize = sizeof(det);

do
{
    printf("\t\"enter the choice\"\n");

    printf("1 : adding the record\n");
    printf("2 : delete the record\n");
    printf("3 : editing the record\n");
    printf("4 : display the record\n");
    printf("5 : exit the program\n");


    fflush(stdin);
    choice = getche(); // or getch()

    switch(choice) //changed the target character
    {
        case '1' : //changed the case from 1 to '1'
        {
                printf("In this add logic\n");
                break;
        }
        case '2' : //changed the case from 2 to '2'
        {
            printf("In this case delete logic\n");
            break;
        }
        case '3' : //changed the case from 3 to '3'
        {
            printf("In this case edit logic\n");
                            break;
        }
        case '4' : //changed the case from 4 to '4'
        {
            printf("display logic\n");
            break;
        }
        case '5' : //changed the case from 5 to '5'
        {
            printf("exit logic\n");
            break;
        }
        default :
        {
            printf("\"Invalid option\"\n");
            break;
        }
    }
}
while(1);
return 0;
}

スイッチを使用して文字を比較することもできます。値を変更するだけ

case 1:

case '1':
于 2012-05-30T10:45:08.730 に答える
2

数値を Choice に、文字を c に取得しているようです。ただし、スイッチで Choice 変数のみを使用しているため、C 変数をチェックすることはありません。

基本的に、文字をヒットすると、C var に格納され、Choice で古い値が再び使用されます。

于 2012-05-30T10:41:01.477 に答える
1

scanfチェックしない値を返します。

指定子とともに使用すると%d、整数を解析する必要があります。整数以外の値を入力したためscanf、エラーコードが返され、choice変更されません

于 2012-05-30T10:39:15.750 に答える