结构元素擦除自己

时间:2013-08-06 23:23:42

标签: c struct

好的,所以我正在使用以下代码从文件中读取一些内容:

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。

2 个答案:

答案 0 :(得分:4)

course号码可以是8个字符,C中的字符串按惯例为空终止。由于你的声明是char course[8],当课程编号中有八个字符时,终止空值将被放在course的末尾,它落在节号中,使其为零。

声明char course[9]应该可以解决问题。

答案 1 :(得分:1)

0几乎肯定是此值的空终止符(以及相同长度的其他值):

"ENGL1301"

当您在字符串末尾包含空终止符时,此8个字符的字符串为9个字符。在这种情况下,空终止符被写入字符串的末尾,这恰好是存储section的位置。

要解决此问题,请将course声明为char course[9]