2012-05-30 3 views
2

В моей программе есть небольшая проблема.Корпус выключателя не работает должным образом в C

Когда я нажимаю 2 или 3 или 4, он будет отображаться правильно, но после этого, когда I нажмите 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; 
} 
+2

'scanf ("% c ", &c);' Что такое thi для? Вы никогда не используете его. – ArjunShankar

+0

'fflush (stdin);' вы * не можете * сделать это. 'fflush' не для потоков INPUT. Вы не можете «промывать» поток INPUT. 'fflush' для потоков OUTPUT (например, чтобы убедиться, что все, что вы печатаете, отправляется на терминал) – ArjunShankar

+1

На самом деле код работает как ожидалось, пока вы добавляете'; 'после строки' В этой логике добавления '. –

ответ

2

Похоже, вы получаете цифры в Choice, а символы - в c. , но вы используете только параметр Choice var в коммутаторе, вы никогда не проверяете C var.

По существу, если вы нажмете письмо, оно сохранит его в C var, а затем снова использует старое значение в Choice.

+0

Это имеет смысл для меня. У ОП есть немного странная программа, и вы, кажется, поняли, что им нужно правильно. – ArjunShankar

1

scanf возвращает вам значение, что вы не проверить.

При использовании с спецификатором %d - он должен анализировать целое число. Поскольку вы вводите нецелое значение - scanf возвращает код ошибки, и choice не изменился

+1

'scanf ("% d ", & choice);' – Mat

+0

oops, вы правы – valdo

2

Хм, одна из вещей неправильно в ваших кодов является:

scanf("%c" , &c); 

потому, что функция зсапЕ требует от пользователя нажать клавишу ввода, прежде чем он может хранить символ соответствующей переменной.

Так что, если компилятор читает строку:

scanf("%c" , &c); 

она считывает ввод, PLUS, то ENTER.
Таким образом, для того, чтобы функция scanf сохранила ваш вход, PLUS, ENTER, в вашу переменную символа.

Было бы лучше, если вы будете использовать getche() или Геч() вместо того, чтобы использовать функцию Scanf(), и, пожалуйста, не когда-либо использовать:

scanf("%c" , &c); 

, потому что он будет генерировать ошибку.


Пример использования getche() или Геч() функции:

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() отображает нажатие клавиши в то время как Геч() не ,


Примечание: Не забудьте поставить

#include<conio.h> 

Добавлена ​​информация: Если вы все еще хотите перейти по использованию зсапЕ() функции просто убедитесь, что вы объявляете свою любимую переменную как:

char c[20]; 

, то вы можете использовать:

scanf("%s", &c); 

но ваша переменная может содержать до 19 символов, как мы объявили в вашем массиве символов.

И краткое изложение не использует:

scanf("%c", &c); 

потому, что это может повлиять на другой зсап() функцию. :)


РЕШЕНИЕ (СПОЙЛЕР):

#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': 
+2

На самом деле это может пойти ужасно неправильно. Что, если пользователь вводит 100 символов, и вы используете 20-символьный буфер? 'scanf' будет записывать адреса памяти, которые нельзя трогать. Вероятно, это приведет к ошибке выполнения. – ArjunShankar

+0

@ArjunShankar, поэтому я указал, что он может содержать до 19 символов, не волнуйтесь, я сейчас обновлю его. :) – ChinoCarloSedilla

+0

@ArjunShankar спасибо за эту идею. Я уже обновил его до гораздо лучшего решения. – ChinoCarloSedilla

0

Это потому, что в с, когда вы читаете символы как целые числа (Scanf ("% D", & выбор);) он принимает ASCii кодекс символы, например a = 97, b = 98 c = 99 d = 100, если вы хотите прочитать a как 1 b как 2 и т. д., вам нужно будет добавить дополнительный код, который сообщает программе, если число равно ascii -коду abcd или e вычесть его с 96, чтобы получить 1,2,3 ..

+0

Нет, выбор читается как «% d», и он будет целым числом, проблема существует в другом месте. –