Frage an c – Schaltergehäuse funktioniert in C nicht richtig

2

In meinem Programm gibt es ein kleines Problem.

Wenn ich 2 oder 3 oder 4 drücke, wird das richtig angezeigt. Wenn ich danach a oder b oder c usw. drücke, wird das vorherige Ergebnis angezeigt, anstatt die Option Ungültig auszudrucken.

Wie kann ich das beheben?

    #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;
}
@ArjunShankar:fgetc() wird nichts lesen, bis Sie newline eingeben, und dann müssen Sie das Überspringen der newline beschäftigen. Sicher ist es machbar; es wäre nicht das, was ich empfehlen würde. Jonathan Leffler
@ MikeKwan - Könnte sein. Meine Kommentare sind Kommentare, keine Antworten :) ArjunShankar
@MikeKwan - Das Programm hat definitiv etwas Seltsames. Undjetzt Damit ich weiß was es ist, habe ich eine Antwort gepostet. Guter Fang, das Semikolon! ArjunShankar
Tatsächlich funktioniert der Code wie erwartet, solange Sie a hinzufügen; nach demIn this add logic Linie. Mike Kwan

Deine Antwort

4   die antwort
2

scanf("%c" , &c);

Denn für die ScanF-Funktion muss der Benutzer die Eingabetaste drücken, bevor er das Zeichen in der entsprechenden Variablen speichern kann.

Wenn also der Compiler die Zeile liest:

scanf("%c" , &c);

Es liest Ihre Eingabe, PLUS, die EINGABETASTE.
Auf diese Weise wird die scanf-Funktion gezwungen, Ihre Eingabe PLUS, die EINGABETASTE, in Ihrer Zeichenvariablen zu speichern.

Es wäre besser, wenn Sie getche () oder getch () anstelle der Funktion scanf () verwenden würden, und verwenden Sie Folgendes nicht:

scanf("%c" , &c);

weil es einen Fehler erzeugen würde.

Anwendungsbeispiel für die Funktion getche () oder 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

Der Unterschied zwischen den beiden besteht darin, dass getche () den Tastendruck anzeigt, getch () nicht.

Hinweis: Vergessen Sie nicht zu setzen

#include<conio.h>

Zusätzliche Informationen: Wenn Sie weiterhin die Funktion scanf () verwenden möchten, stellen Sie sicher, dass Sie Ihre Lieblingsvariable wie folgt deklarieren:

char c[20];

dann kannst du benutzen:

scanf("%s", &c);

Ihre Variable kann jedoch nur bis zu 19 Zeichen enthalten, wie in Ihrem Zeichenfeld angegeben.

Und die Zusammenfassung wird nicht verwendet:

scanf("%c", &c);

weil es Ihre anderen scanf () - Funktionen beeinträchtigen kann. :)

LÖSUNG (Spoiler Warnung):

#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;
}

Sie können switch auch zum Vergleichen von Zeichen verwenden. Ändern Sie einfach die Werte

case 1:

zu

case '1':
Eigentlich kann das schrecklich schief gehen. Was passiert, wenn der Benutzer 100 Zeichen eingibt und Sie einen 20-Zeichen-Puffer verwenden?scanf schreibt in Speicheradressen, die nicht berührt werden dürfen. Dies wird wahrscheinlich einen Laufzeitfehler verursachen. ArjunShankar
Während das OP mit dieser Antwort möglicherweise einverstanden ist, ist die Verwendung von "conio.h" normalerweise eine schlechte Idee. Was den C-Standard betrifft, gibt es keinenconio.h. Viele Maschinen nichthaben a conio.h. Darüber hinaus sind Definitionen inconio.h haben auch ein leicht unterschiedliches Verhalten basierend auf dem Compiler, der es ausgeliefert hat. Hier können Sie nachlesen, warum:en.wikipedia.org/wiki/Conio.h ArjunShankar
danke ChinoCarloSedilla deine Antwort ist perfekt für mich .. Krunal Gandhi
@ ArjunShankar danke für diese Idee. Ich habe es bereits auf eine viel bessere Lösung aktualisiert. ChinoCarloSedilla
0

dass in c, wenn Sie Zeichen als Ganzzahlen lesen (scanf ("% d", & choice;)), der ASCII-Code der Zeichen verwendet wird, beispielsweise a = 97, b = 98, c = 99, d = 100, wenn Sie möchten Lese a als 1 b als 2 usw. Du musst einen zusätzlichen Code hinzufügen, der dem Programm mitteilt, ob die Zahl gleich dem ASCII-Code von abcd ist, oder subtrahiere ihn mit 96, so dass du 1,2,3 erhältst.

Nein, die Auswahl wird als "% d" gelesen, und es wird eine ganze Zahl sein, das Problem besteht an anderer Stelle. Antti Haapala
1

scanf Gibt einen Wert zurück, den Sie nicht überprüfen.

Bei Verwendung mit%d spezifizierer - es sollte eine ganze Zahl parsen. Da Sie einen nicht ganzzahligen Wert eingeben -scanf gibt einen Fehlercode zurück undchoice ist unverändert

hoppla du hast recht valdo
scanf("%d" , &choice); Mat
2

als würden Sie die Zahlen in Choice und die Zeichen in c eintragen. Sie verwenden jedoch nur die Variable Choice im Switch. Sie überprüfen niemals die Variable C.

Wenn Sie also einen Buchstaben treffen, wird dieser in C var gespeichert und der alte Wert in Choice erneut verwendet.

Das macht für mich Sinn. Das OP hat ein etwas seltsames Programm, und Sie scheinen richtig verstanden zu haben, was sie wollen. ArjunShankar

Verwandte Fragen