第八次迭代后将变量设置为零

时间:2020-09-30 23:43:40

标签: c file-io

我正在为类的C风格文件做作业。我已经走了很远,但是在我的循环中,变量的行为很奇怪。在第八次迭代中将z设置为0时,将z设置为0后,我不确定为什么将它明显加1时为什么将其设置为0。

//Aaron Hervey
//Date: 09/23/2020

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

struct Room{
    long size;
    char * details;
    char * name[sizeof(size)];
    char * desc[sizeof(size)];
    char * exit[sizeof(size)];
};

int main(int argc, char *argv[]){
    //Variables
    unsigned int i = 0;
    char * holder;
    long size;
    char choice;
    bool fa = true;
    FILE *fl;
    Room p;
    //Error checking commmand line
    if (argc < 1) {
          printf("Usage: %s <filename>\n", argv[0]);
          return -1;
    }
    char test[] = "room1";
    fl = fopen(test, "rb");
    if (fl==nullptr){
        printf ("Error opening file");
    }
    
    //Get File Size
    fseek(fl, 0, SEEK_END);
    size = ftell(fl);
    p.size = size;
    rewind(fl);

    //Allocate whole fize size to var & Write file into struct member
    p.details = (char*)malloc(sizeof(char)*size);
    fread(p.details, 1, size, fl);

    //Write file into struct
    unsigned int z = 0;
    while (true){
        if (z==8){
            int test = 1;
        }
        if(z>0){
            holder = strtok(nullptr , "~");
            if(holder == nullptr){
                break;
            }
            p.name[z] = holder;

            holder = strtok(nullptr , "~");
            p.desc[z] = holder;

            holder = strtok(nullptr , "~");
            p.exit[z] = holder;
            z++;  
        }
        else{
            holder = strtok(p.details , "~");
            if(holder == nullptr){
                break;
            }
            p.name[z] = holder;

            holder = strtok(nullptr , "~");
            p.desc[z] = holder;

            holder = strtok(nullptr , "~");
            p.exit[z] = holder;
            z++;
        }
    }

fclose(fl);

    //Menu
while(fa){
    printf("> ");
    scanf("%c", &choice);
        switch (choice){
            case 'q':
                fa = false;
                break;
            case 'l':
                printf("%s\n", p.name[i]);
                printf("%s\n", p.desc[i]);
                printf("Exits: %s\n", p.exit[i]);
                i++;
                break;
            case 'w':
                break;
            case 'n':
                break;
            case 's':
                break;
            case 'e':
                break;
        }
    }
    return 0;
}

如您所见,我有一个循环,可以将结构中的文件信息连续存储到数组中,但是我似乎无法理解为什么迭代变量不起作用

1 个答案:

答案 0 :(得分:2)

Distance = 

var _lat1 = RADIANS(40.524670)
var _lon1 = RADIANS(-111.863823)
var _lat2 = RADIANS(41.7379)
var _lon2 = RADIANS(-111.8308)

var R = 6371

var _dif1 = (_lat2 - _lat1)
var _dif2 = (_lon2 - _lon1)

var _a = (sin(_dif1/2)^2) + cos(_lat1) * cos(_lat2) * (sin(_dif2/2) ^ 2)

var _c  =  2*ASIN(SQRT(_a))

return _c * R

这将long size; char * name[sizeof(size)]; 声明为通常为8(可能为4或其他值)的数组name

char *

p.name[z] = holder; 等于8时,您正在写出数组的边界,所以任何事情都可能发生,其中之一就是覆盖变量z本身。