【问题标题】:airline reservation system in cc语言中的机票预订系统
【发布时间】:2016-10-15 20:18:00
【问题描述】:

我正在尝试创建一个航空公司预订系统,它应该预订机票,显示预订的机票,并取消机票。我已经使用数组结构编写了代码。目前,代码仅执行预订票并退出。

但是当我按 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();

}

【问题讨论】:

  • 首先,我们可以假设您正在使用类似于 C++ 编译器的东西进行编译,因为如果不是,passengers passenger[10]; 不应该编译,更不用说链接和运行了。而且您似乎忘记了main() 之后的{,这又会阻止编译。关于您的异常,您没有为字符串读取分配空间,因此这样做会调用未定义的行为。
  • passengers passenger[10]; 应该是 struct passengers passenger[10]; 请重写整个内容。实在是太乱了!
  • 学习使用调试器自己调试问题。
  • @WhozCraig 我应该如何为其中的字符串分配空间?
  • 这段代码有很多个问题,假设已经提到的问题已经修复。字符串比较不正确,for (int a = 0; a &gt;= 10; a++) 没有机会迭代,所以seat 将永远是0。为这样的事情制作了一个调试器,看来您拥有最好的调试器之一(Visual Studio 可以说是 Windows 上最好的用户程序调试器;使用它)。

标签: c arrays visual-studio-2015 switch-statement structure


【解决方案1】:

你有很多问题,这些应该会有所帮助。但您可能需要解决其他人强调的问题:

  1. scanf_s 应该被传递给 %s 的 size 参数,你使用它就像你使用的是 scanf 而不是 scanf_s 见这里:https://msdn.microsoft.com/en-us/library/w40768et.aspx

  2. 您没有使用 malloc() 或其他方式为字符串分配空间。因此,当 scanf_s 尝试写入输入的值时,它将踩在变量指向的任何内容上。我认为这不是可写内存。

  3. 您指的是结构中指针字段的地址,而不是为该指针分配内存并在该指针字段中传递值:

    • 分配: 乘客[座位].firstname=(char*)malloc(MAX_FIRSTNAME_SIZE);

    • 更改: '&passenger[seat].firstname' 到 'passenger[seat].firstname'

另外(如果我错了,请原谅我)它看起来像一个学期结束项目或一个测试问题。不管这个建议多么不受欢迎:我建议您查看一些有关设置断点和使用 Visual Studio 调试器的文档。即使只是在调试模式下运行项目,也会将您带到发生错误的位置。如果您需要在测试中这样做,这将帮助您更好地学习技能并节省宝贵的时间。

希望对你有帮助。

【讨论】:

  • 我已按照您的说明进行了更改。由于我正处于许多事情的学习阶段,您的建议肯定是有益的。通过进行所有更改,运行程序后,当我按第一个选项时,它显示“输入名字”。当我输入时,它给了我这个错误“ConsoleApplication1.exe 中的 0x0FFAFBB3 (ucrtbased.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x0004B000。”
  • 您的 malloc 调用需要在您选择“seat”的值之后进行,即在“if (seat
【解决方案2】:

您定义了一个乘客[10] 数组,因此该数组的有效索引从 0..9 开始。但是,initialize() 函数中的 for 循环也尝试使用索引 10 (a = 10',我认为您的意思是使用 'a

【讨论】:

  • 是的。我的意思是使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2014-05-24
相关资源
最近更新 更多