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

看起来您将数字放入 Choice 中,将字符放入 c 中。但是您只在开关中使用了 Choice var,您永远不会检查 C var。

所以本质上,如果你点击一个字母,它会将它存储在 C var 中,然后再次使用 Choice 中的旧值。

于 2012-05-30T10:41:01.477 回答
2

嗯,您的代码中的错误之一是:

scanf("%c" , &c);

因为,scanf 函数要求用户在将字符存储到其各自的变量之前按下回车键。

因此,如果编译器读取该行:

scanf("%c" , &c);

它会读取您的输入,PLUS,ENTER。
因此,强制 scanf 函数将您的输入 PLUS ENTER 存储到您的字符变量中。

如果您使用 getche() 或 getch() 而不是使用 scanf() 函数会更好,并且请不要使用:

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

两者之间的区别在于 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;
}

您还可以使用 switch 来比较字符。只需更改值

case 1:

case '1':
于 2012-05-30T10:45:08.730 回答
1

scanf返回您不检查的值。

当与%d说明符一起使用时 - 它应该解析一个整数。由于您输入了一个非整数值 -scanf返回一个错误代码,并且choice没有更改

于 2012-05-30T10:39:15.750 回答
0

这是因为在 c 中,当您将字符读取为整数时 (scanf("%d" , &choice);) 它需要字符的 ascii 代码,例如 a = 97, b = 98 c = 99 d = 100 如果你想将 a 读为 1 b 读为 2 等,您将不得不添加一些额外的代码来告诉程序该数字是否等于 abcd 的 ascii 代码,或者 e 用 96 减去它,这样您就得到了 1,2,3..

于 2013-08-07T08:28:39.237 回答