gpt4 book ai didi

c - 缓冲区溢出或其他

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:40 25 4
gpt4 key购买 nike

我正在创建一个关于座位预订的程序。我被要求对某些变量使用 unsigned short 和 unsigned int,所以这就是它们被设置成这样的原因。我有一个运行正常的程序。但是当我在一个函数中传输所有内容时,一切似乎都正常,但在我的结构中奇怪的值开始到处保存..我只想保存文件的值(从第 2 行 -> 文件末尾)。因为我有一个要初始化的结构,所以我必须首先读取 txt 文件和 numberofseats,我已经声明了这个变量(passenger)2 次..在函数(local var)和主体中..也许这会导致问题?如果我不使用函数,一切正常!

所以有问题的代码:

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

int i,j,numberofseats,temp;
char platenr[8],selection,buff[60];
char firstname[20];
char lastname[20];
char phone[11];
char *p;
typedef struct
{
char fullname[40];
unsigned short phonenr[10];
unsigned int seatnr;
}PASSENGERS;

void readfile( void)
{
FILE *businfo;
businfo = fopen ("bus.txt","r");
if (businfo == NULL)
{
printf("Error Opening File, check if file bus.txt is present");
exit(1);}
else
{
fscanf(businfo,"%s %d",platenr, &numberofseats);
printf("Bus Licence plate Nr is: %s and number of seats is: %d", platenr, numberofseats);
PASSENGERS passenger[numberofseats];
for (j=0;j<numberofseats;j++)
{passenger[j].seatnr=j+1;
strcpy(passenger[j].fullname,"\0");
}
while (fgets(buff,sizeof(buff),businfo)!=0)
{sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone);
strcpy(passenger[temp-1].fullname,firstname);
strcat (passenger[temp-1].fullname, " ");
strcat(passenger[temp-1].fullname,lastname);
printf("%s",passenger[temp-1].fullname);
i=0;
for (p=phone;*p!='\0';p++)
{
(passenger[temp-1].phonenr[i])=*p -'0';
i++;
}
}
}
}

int main(void)
{
readfile();
PASSENGERS passenger[numberofseats];

最佳答案

函数 foo 中名为 x 的变量与函数 bar 中名为 y 的变量无关.也就是说:main中的passengerreadfile中的passenger是不同的变量。改变一个不会影响另一个。

你想要的大概是这样的:

int main(void)
{
PASSENGERS passenger[numberofseats];
readfile(passenger);
^^^^^^^^^
Pass array as a pointer
....
}

void readfile(PASSENGERS* passenger)
{
....

// REMOVE THIS: PASSENGERS passenger[numberofseats];


}

在那条通知旁边:

// Global variables gets zero initialized
int i,j,numberofseats,temp;
^^^^^^^^^^^^
Becomes zero at start up

但你仍然在 main 中使用它:

PASSENGERS passenger[numberofseats];

这可能不是您真正想要的。

由于您尝试读取函数中的座位数,因此您确实想要使用动态内存分配。喜欢:

PASSENGERS* readfile()
{
.....
.....

PASSENGERS* p = malloc(numberofseats * sizeof(PASSENGERS));

.....
.....
return p;
}

int main(void)
{
PASSENGERS* passenger = readfile();
.....
.....
free(passenger);
return 0;
}

如果您不想动态分配,则必须将numberofseats 的输入移动到main 中,以便在声明数组之前完成.

关于c - 缓冲区溢出或其他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41206367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com