C 变量在第八次迭代后设置为零
我正在为课堂做一个关于c风格文件的作业。我已经做了很多,但是在我的循环中,变量的行为很奇怪。在第八次迭代之后,z设置为0,而它应该设置为9。我不知道为什么它会被设置为0,如果它显然是添加1C 变量在第八次迭代后设置为零,c,file-io,C,File Io,我正在为课堂做一个关于c风格文件的作业。我已经做了很多,但是在我的循环中,变量的行为很奇怪。在第八次迭代之后,z设置为0,而它应该设置为9。我不知道为什么它会被设置为0,如果它显然是添加1 //Aaron Hervey //Date: 09/23/2020 #include <cstdio> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string
//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;
}
//Aaron Hervey
//日期:2020年9月23日
#包括
#包括
#包括
#包括
#包括
结构室{
长尺寸;
字符*详细信息;
字符*名称[sizeof(大小)];
char*desc[sizeof(size)];
char*exit[sizeof(size)];
};
int main(int argc,char*argv[]){
//变数
无符号整数i=0;
字符*持有者;
长尺寸;
字符选择;
布尔法=真;
文件*fl;
p室;
//检查命令行时出错
如果(argc<1){
printf(“用法:%s\n”,argv[0]);
返回-1;
}
字符测试[]=“room1”;
fl=fopen(测试,“rb”);
如果(fl==nullptr){
printf(“打开文件时出错”);
}
//获取文件大小
fseek(fl,0,SEEK_END);
尺寸=英尺(fl);
p、 大小=大小;
倒带(fl);
//将整个fize大小分配给var&将文件写入结构成员
p、 详细信息=(char*)malloc(sizeof(char)*大小);
fread(p.详图,1,尺寸,fl);
//将文件写入结构
无符号整数z=0;
while(true){
如果(z==8){
int检验=1;
}
如果(z>0){
持有者=strtok(空PTR,“~”);
如果(保持器==nullptr){
打破
}
p、 名称[z]=持有人;
持有者=strtok(空PTR,“~”);
p、 desc[z]=保持架;
持有者=strtok(空PTR,“~”);
p、 出口[z]=保持架;
z++;
}
否则{
持有人=strtok(p.详情,“~”);
如果(保持器==nullptr){
打破
}
p、 名称[z]=持有人;
持有者=strtok(空PTR,“~”);
p、 desc[z]=保持架;
持有者=strtok(空PTR,“~”);
p、 出口[z]=保持架;
z++;
}
}
fclose(fl);
//菜单
while(fa){
printf(“>”);
scanf(“%c”,选择(&c));
开关(选择){
案例‘q’:
fa=假;
打破
案例“l”:
printf(“%s\n”,p.name[i]);
printf(“%s\n”,p.desc[i]);
printf(“出口:%s\n”,p.exit[i]);
i++;
打破
案例“w”:
打破
案例“n”:
打破
案例s:
打破
案例“e”:
打破
}
}
返回0;
}
如您所见,我有一个循环,它不断地将文件信息从结构存储到数组中,但我似乎无法理解为什么迭代变量不合作
long size;
char * name[sizeof(size)];
这将name
声明为通常为8的数组(可能是4或其他值)char*
p.name[z] = holder;
当z
等于8时,您写入的内容超出了数组的边界,因此任何事情都可能发生,其中之一就是覆盖变量z
本身
这将name
声明为通常为8的数组(可能是4或其他值)char*
p.name[z] = holder;
当
z
等于8时,您写入的内容超出了数组的边界,因此任何事情都可能发生,其中之一就是覆盖变量z
本身。scanf(“%c”,&choice)代码>--注意添加的空格..等等,我在代码中没有看到。你是要我加进去吗@DavidC.RankinIn//菜单
每次用户输入一个选项并按Enter a“\n”
将留在stdin
中,作为下一个输入。在“%c”
前面添加空格可确保忽略该空格。感谢您的建议!我在输入方面遇到了问题,但无法确定是什么@DavidC.RankinBetter,char choice[256]代码>然后fgets(选项、选项大小、标准输入)代码>然后是开关(*cihoice){…}
,这相当于开关(选项[0]){…}
。这样,即使用户输入“e代表所有人…”
整行都会被消耗,您与“e”
的比较也一样,但任何一个输入影响下一个输入的可能性都会被消除…scanf(“%c”,&choice)代码>--注意添加的空格..等等,我在代码中没有看到。你是要我加进去吗@DavidC.RankinIn//菜单
每次用户输入一个选项并按Enter a“\n”
将留在stdin
中,作为下一个输入。在“%c”
前面添加空格可确保忽略该空格。感谢您的建议!我在输入方面遇到了问题,但无法确定是什么@DavidC.RankinBetter,char choice[256]代码>然后fgets(选项、选项大小、标准输入)代码>然后是开关(*cihoice){…}
,这相当于开关(选项[0]){…}
。这样,即使用户输入“e代表所有人…”
整行都会被消耗掉,您与“e”进行比较的结果也一样,但是任何一个输入影响下一个输入的可能性都会被消除……您对我可以做些什么来纠正这一点有什么建议吗?我希望他们是灵活的或足够大,以处理任何文件你有什么建议,我可以做,以纠正这一点?我希望他们是灵活的或大到足以处理任何文件