好的,所以我正在使用以下代码从文件中读取一些内容:
for (i=0; i<start;i++)
{
filename=files[i];
if((fp=fopen(filename, "r"))==NULL)
{
printf("unable to open %s\n", filename);
exit(1);
}
while(fgets(buffer, sizeof(buffer), fp) !=NULL)
{
d[counter].id=atoi(strtok(buffer, del));
strcpy(buffer2, strtok(NULL, del));
len=strlen(buffer2);
if(buffer2[len-1]=='\n')
buffer2[len-1]='\0';
strcpy(d[counter].name, buffer2);
counter++;
}
token = strtok (filename, del1);
holder=token;
token = strtok (NULL, del1); /* section*/
token2 = strtok(holder, del2);
token2 = strtok(NULL, del2); /*course name */
for(x=z;x<counter;x++)
{
d[x].section=atoi(token);
printf("%d ", d[x].section);
strcpy(d[x].course, token2);
printf("%s %d %s %d\n", d[x].course, d[x].section, d[x].name, d[x].id);
}
z=counter;
}
结构定义:
struct student {
char course[8];
int section;
char name[19];
int id;
};
除了结构中的“section”之外,所有内容都打印得很好,由于某种原因,元素在一定量之后自身为0。
这是输出:
1 CSE1325 1 Sally 3233
1 CSE1325 1 George 9473
2 CSE1325 2 Tom 1234
2 CSE1325 2 Ralph 3540
2 CSE1325 2 Mary 5678
1 CSE2312 1 Tom 1234
1 CSE2312 1 Ralph 3540
1 CSE2312 1 Mary 5678
1 CSE2315 1 Tom 1234
1 CSE2315 1 Ralph 3540
1 CSE2315 1 Mary 5678
2 CSE2315 2 Sally 3233
2 CSE2315 2 George 9473
4 ENGL1301 0 Tom 1234
4 ENGL1301 0 Sally 3233
4 ENGL1301 0 Ralph 3540
4 ENGL1301 0 Mary 5678
4 ENGL1301 0 George 9473
1 HIST1311 0 Tom 1234
1 HIST1311 0 Sally 3233
1 HIST1311 0 Ralph 3540
1 HIST1311 0 Mary 5678
1 HIST1311 0 George 9473
5 MATH1426 0 Sally 3233
5 MATH1426 0 George 9473
这是预期的输出:
1 CSE1325 1 Sally 3233
1 CSE1325 1 George 9473
2 CSE1325 2 Tom 1234
2 CSE1325 2 Ralph 3540
2 CSE1325 2 Mary 5678
1 CSE2312 1 Tom 1234
1 CSE2312 1 Ralph 3540
1 CSE2312 1 Mary 5678
1 CSE2315 1 Tom 1234
1 CSE2315 1 Ralph 3540
1 CSE2315 1 Mary 5678
2 CSE2315 2 Sally 3233
2 CSE2315 2 George 9473
4 ENGL1301 4 Tom 1234
4 ENGL1301 4 Sally 3233
4 ENGL1301 4 Ralph 3540
4 ENGL1301 4 Mary 5678
4 ENGL1301 4 George 9473
1 HIST1311 1 Tom 1234
1 HIST1311 1 Sally 3233
1 HIST1311 1 Ralph 3540
1 HIST1311 1 Mary 5678
1 HIST1311 1 George 9473
5 MATH1426 5 Sally 3233
5 MATH1426 5 George 9473
查看数字如何匹配?但是对于我的它没有,当我在for循环中单独打印d[x].section
时它打印正确的东西,但是当我在组合的print语句中使用它时由于某种原因它在到达ENGL1301时打印出0。
答案 0 :(得分:4)
course
号码可以是8个字符,C
中的字符串按惯例为空终止。由于你的声明是char course[8]
,当课程编号中有八个字符时,终止空值将被放在course
的末尾,它落在节号中,使其为零。
声明char course[9]
应该可以解决问题。
答案 1 :(得分:1)
0
几乎肯定是此值的空终止符(以及相同长度的其他值):
"ENGL1301"
当您在字符串末尾包含空终止符时,此8个字符的字符串为9个字符。在这种情况下,空终止符被写入字符串的末尾,这恰好是存储section
的位置。
要解决此问题,请将course
声明为char course[9]