我正在创建一个关于预订座位的程序。我被要求对一些变量使用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中的mainpassenger中的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/

10-12 21:22