我正在创建一个关于预订座位的程序。我被要求对一些变量使用unsigned short和unsigned int,所以它们被设置成这样。
我有一个工作正常的程序。但是当我在一个函数中传输所有内容时,所有内容看起来都工作正常,但是在我的结构中,奇怪的值开始被保存到所有地方。。
我只想保存文件的值(从第2行->文件末尾)。
因为我有一个要初始化的结构,我首先要读取txt文件和numberofseats,我已经在函数(local var)和主体中声明了这个变量(passenger)2次。。
也许这会引起问题?
如果我不使用函数,一切都会好起来的!
所以有问题的代码:
#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];
最佳答案
函数x
中名为foo
的变量与函数y
中名为bar
的变量无关。换句话说:passenger
中的main
和passenger
中的readfile
是不同的变量。改变一个不会影响另一个。
你想要的可能更像这样:
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
但你仍然主要使用它:
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/