在C中取出一段字符数组的问题

时间:2017-12-09 02:44:32

标签: c arrays data-structures structure

我这里有一个source.txt文件: https://palomar.blackboard.com/bbcswebdav/pid-1168887-dt-content-rid-3710280_1/courses/2177-70219/payfile%281%29.txt

void readData() { // Scans each line from the .txt and puts each line into an element in the array
    FILE *fp;
    fp = fopen("info.txt", "r");

    char Line[100];
    int i = 0;

    while (!feof(fp)) {

        char agetemp[3];
        char tenuretemp[2];
        char salarytemp[7];

        fgets(Line, 100, fp);
        strsub(Line, employee[i].first, 0, 6);
        strsub(Line, employee[i].initial, 8, 9);
        strsub(Line, employee[i].last, 10, 18);
        strsub(Line, employee[i].street, 20, 35);
        strsub(Line, employee[i].city, 37, 46);
        strsub(Line, employee[i].state, 49, 50);
        strsub(Line, employee[i].zip, 52, 56);
        strsub(Line, employee[i].sex, 61, 61);

        strsub(Line, agetemp, 58, 59);
        employee[i].age = atoi(agetemp); // converted the age column to an int

        strsub(Line, tenuretemp, 63, 63);
        employee[i].tenure = atoi(tenuretemp); // converted tenure column to an int

        strsub(Line, salarytemp, 65, 70);
        employee[i].salary = atof(salarytemp); // converted the salary column to float

        i++;
    }
}

我的任务是给我一个用户自定义的函数,名为strsub,在这里定义:

void strsub(char buf[], char sub[], int start, int end) { // function template for strsub
    int i, j;

    for (j = 0, i = start; i <= end; i++, j++) {
        sub[j] = buf[i];
    }
    sub[j] = '\0';
}

所以基本上当我扫描源.txt文件时,strsub函数会挑出特定的段并将它们放入其各自的结构数组中。它在大多数情况下都可以正常工作,例如当我打印出employee[2].city时:

https://prnt.sc/hl25n7

那里没有错。但是,当我尝试打印出employee[i].first变量时,它会将一堆字母拼凑起来,比我告诉它要多,而且我不知道为什么。这是我尝试打印employee[2].first时的图片:

https://prnt.sc/hl26gt

readData()中,我只告诉它从0到6,为什么它比我说的更多输入而不仅仅是前7个字符?

哦,这也是我的结构;我把它放在一个单独的头文件中:

struct info {
    char first[7];
    char initial[1];
    char last[9];
    char street[16];
    char city[11];
    char state[2];
    char zip[5];
    int age;
    char sex[1];
    int tenure;
    double salary;
};

1 个答案:

答案 0 :(得分:0)

我们需要看到员工的记录结构。如果first被定义为char [7],则它没有足够的内存来容纳0-6(即7 char)+ null终止。此外,如果initial为1 char,则如果输入为8,9,则您的函数将处理2个字符。