2016-10-15 25 views
-3

私は航空券予約をして予約したチケットを表示し、チケットのキャンセルを行う航空会社の予約システムを作成しようとしています。今のところ、コードは予約チケットのみを実行して終了します。航空会社の予約システムc

予約チケットのために1を押すと、オプションを受け取りますが、ConsoleApplication1.exeの0x0FFAFBB3(ucrtbased.dll)に例外がスローされます。0xC0000005:0x0004B000のアクセス違反を書き込むアクセス違反です。

コードは以下のとおりです。誰でもコード内のエラー領域を特定できますか?

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

void initialize(); 
void reserve(); 

struct passengers { 

char* firstname;  
char* surname; 
char* passport; 
}; 

passengers passenger[10]; 


void initialize() 
{ 
for (int a = 0; a < 10; a++) { 

    passenger[a].passport = ""; 
    passenger[a].firstname = ""; 
    passenger[a].surname = ""; 

} 

} 
void pause() 
{ 
printf("\n"); 
system("pause"); 
system("cls"); 
} 


int main() { 

int seat = 0; 

initialize(); 

int choice; 

do { 
    system("cls"); 
    printf("\n\n\t\t*************************************\n\n"); 
    printf("\t *****Welcome To airline reservation system*****\n\n"); 
    printf("\t\t\t ******************"); 
    printf("\n\n\t\t 1. RESERVE SEAT"); 
    printf("\n\n\t\t 2. CANCEL SEAT"); 
    printf("\n\n\t\t 3. DISPLAY SEAT LAYOUT"); 
    printf("\n\n\t\t 4. EXIT SYSTEM"); 
    scanf_s("%d", &choice); fflush(stdin); 


    switch (choice) { 

    case 1: reserve(); 
     break; 
    case 2: cancel(); 
     break; 
    case 3: display(); 
     break; 
    case 4: exit(0); 
     break; 
    default: 
     printf("\nInvalid Choice"); 
    } 

} while (choice != 4); 



_getch(); 

} 


void reserve() 
{ 
int seat = 0; 
passenger[seat].firstname = (char*)malloc(15); 
passenger[seat].surname = (char*)malloc(15); 
passenger[seat].passport = (char*)malloc(9); 

for (int a = 0; a < 10; a++) 
{ 

    if (passenger[a].passport == "") 
    { 
     seat = a; 
     break; 
    } 


} 

if (seat < 10) 
{ 
    printf("\n\t\t Enter First Name:"); 
    scanf_s("%s", passenger[seat].firstname); 

    printf("\n\t\t Enter Surname:"); 
    scanf_s("%s", passenger[seat].surname); 

    printf("\n\t\t Enter Passport Number:"); 
    scanf_s("%s", passenger[seat].passport); 


} 
else { 

    printf("\n\t\t Sorry, No seats are available"); 


} 

pause(); 

} 
+1

まず、 'passengers passenger [10];'はコンパイルすべきでなく、リンクと実行がずっと少なくなければならないので、これをC++コンパイラに似たものでコンパイルしているとします。そして、あなたは 'main()'の後に '{'を忘れてしまったように思えます。あなたの例外に関しては、文字列読み込みのためのスペースを割り当てないので、それは未定義の動作を呼び出します。 – WhozCraig

+0

'乗客乗客[10];'構造乗客乗客[10]; 'すべてのものを書き換えてください。それはあまりにも多くの混乱です! – iSS

+4

デバッガを使用して問題を自分でデバッグする方法を学びます。 – kaylum

答えて

0

これらは多くの問題を抱えています。しかし、あなたは他の人がハイライト表示されている問題を修正する必要があるかもしれません:

    scanf_sは、%sのサイズパラメータを渡す必要があり

  1. あなたはscanf関数を使用していないかのように、あなたがそれを使用しているscanf_sはこちらをご覧ください:https://msdn.microsoft.com/en-us/library/w40768et.aspx

  2. malloc()などの手段を使用して文字列のスペースを割り当てているわけではありません。したがって、scanf_sが入力された値を書き込もうとすると、変数が指し示しているものが何であれ踏ん張ります。私は書き込み可能なメモリではないと推測しています。あなたは構造体のポインタフィールドのアドレスを参照の代わりに、そのポインタにメモリを割り当て、そのポインタフィールドに値を渡している

    • は割り当て: 乗客[席] .firstnameを=(char *)malloc(MAX_FIRSTNAME_SIZE);

    • 変更: '乗客[席] .firstname' へ '&乗客[席] .firstname' も

は(私はこの間違っを得た場合、私はご容赦)それは次のようになります長期的な最終プロジェクトまたはテスト問題。どのようにこのアドバイスが望ましくないかにかかわらず、ブレークポイントの設定とVisual Studioデバッガの使用に関するいくつかのドキュメントをチェックすることをお勧めします。デバッグモードでプロジェクトを実行するだけで、エラーが発生した場所に移動することができます。これは、テストでこれを行う必要がある場合は、スキルをより良く学び、貴重な時間を節約するのに役立ちます。

希望します。

+0

私はあなたが述べた変更を加えました。私は多くのことの学習段階にあるので、あなたのアドバイスは確かに有益です。 すべての変更を加えることで、プログラムを実行した後、最初のオプションを押すと「first nameを入力」と表示されます。私が入力すると、それは私にConsoleApplication1.exeの0x0FFAFBB3(ucrtbased.dll)でスローされた例外:0xC0000005:アクセス違反が0x0004B000の場所に書き込まれるというエラーが表示されます。 – Bonzi

+1

malloc呼び出しは、 'seat'の値を選択した後でなければなりません。 'if(seat <10)'ブロックの先頭にある。 –

0

乗客[10]配列を定義したので、この配列への有効なインデックスは0..9です。しかし、initialize()関数のforループも、配列の最後を超えるインデックス10(< = 10)を使用して初期化を試みます。これはメモリを破壊します。同様に、あなたのreserve()関数では、forループの条件が間違っています。あなたは 'a> = 10'を持っています。 '< 10'を使うつもりです。

+0

はい。私は<10を使用することを意味しました。 Iveはすでにそれを修正しました。今、私が宣言した文字列のメモリ割り当てに取り組んでいます。ありがとうございました – Bonzi

関連する問題