我正在为类的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;
}
如您所见,我有一个循环,可以将结构中的文件信息连续存储到数组中,但是我似乎无法理解为什么迭代变量不起作用
答案 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
本身。