Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量在第八次迭代后设置为零_C_File Io - Fatal编程技术网

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

C 变量在第八次迭代后设置为零,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

我正在为课堂做一个关于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>

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”进行比较的结果也一样,但是任何一个输入影响下一个输入的可能性都会被消除……您对我可以做些什么来纠正这一点有什么建议吗?我希望他们是灵活的或足够大,以处理任何文件你有什么建议,我可以做,以纠正这一点?我希望他们是灵活的或大到足以处理任何文件