2

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

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;

};

除了结构中的“部分”之外,一切都打印得很好,由于某种原因,元素在一定数量后使其自身为 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

看看数字如何匹配?但对我来说不是这样,当我d[x].section在 for 循环中作为独立打印时,它会打印正确的东西,但是当我出于某种原因在组合打印语句中使用它时,它会在达到 ENGL1301 时打印出 0。

4

2 回答 2

4

course数字可以是八个字符,并且按照C惯例,其中的字符串以空值结尾。由于您的声明是char course[8],当课程编号中有八个字符时,终止的空值将被推迟course到部分编号的末尾,使其为零。

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

于 2013-08-06T23:32:49.273 回答
1

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

"ENGL1301"

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

要解决此问题,请声明coursechar course[9]

于 2013-08-06T23:32:56.777 回答