第一次调用strtok()总是在我的char *数组中写入0

时间:2019-07-18 16:23:57

标签: c

我想从文件中读取一些数字,目的是将它们放入名为int的“多维” point数组中。我想将文件的每一行放在第一维元素中,并将strtok传递的每个子字符串放在放置匹配行的维度的“子元素”中。

我通过运行两个封装的for循环来做到这一点,第一个按时间顺序从文件中获取每一行,第二个借助strtok拆分行并将其存储在char*中数组,以后再用int将其转换为strtol

除了第一个分隔的字符串外,其他所有分隔的字符串都可以正常工作。无论文件中该位置实际有多少数字,文件第一行中的第一个子字符串始终会保存为0。 任何想法可能导致此问题?我一直在找几个小时,但无法解决。

通过故障排除,我得出的结论是,strtok()的第一次调用很可能出了点问题。但这对我来说很好。

void pointvalue() {
    char **substr = malloc(3 * sizeof(char*));
    int point[5][3];
    char buffer[20];
    char*endpos;

    FILE *pf = fopen("PATH", "r");

    if (pf != NULL) {
        for(int i = 0; fgets(buffer, 20, pf); i++) {

            for(int k = 0; k < 3; k++) {
                if (k == 0) substr[k] = strtok(buffer, ";");
                else {
                    substr[k] = strtok(NULL, ";");

                }
                point[i][k] = strtol(substr[k], &endpos, 0);

                printf("%d ",point[i][k]);
            }
        }
    } else {
        perror("Couldn`t load file");
    }
}     

在文件中两行数字带有定界符“;”被写。 示例:

3;4;5;
6;9;2;

我编写的函数可以打印:

0 4 5 6 9 2

编辑:这是我使用时打印出的内容:

printf("[%s] %d\n",substr[k],point[i][k]);

    [´╗┐3] 0[4] 4[5] 5[6] 6[9] 9[2] 2

2 个答案:

答案 0 :(得分:0)

int point[5][3];
...
for(int i = 0; fgets(buffer, 20, pf); i++) {
    ...
    point[i][k] = strtol(substr[k], &endpos, 0);
    ...
}

虽然这可能不是问题的根源,但请注意,程序很容易将其写入内存中的随机位置,从而导致未定义的行为。

如果for被执行5次以上,就会发生这种情况:i将指向point之外。

答案 1 :(得分:0)

您的问题很可能是由于输入文件包含一个初始字节序列(称为BOM)(用于字节顺序标记),应该表明文件内容是UTF-8编码的字节流。

您应该配置文本编辑器以避免产生这样的指示符,或者修改程序以使其忽略。

请注意,应通过限制从文件读取的行数来防止缓冲区溢出,并且也应关闭文件。

这是您的函数的简化版本:

void pointvalue() {
    int point[5][3] = {{ 0 }};
    char buffer[128];
    FILE *pf = fopen("PATH", "r");

    if (pf != NULL) {
        /* skip an initial BOM in the text file */
        scanf(pf, "%*1[\xEF]%*1[\xBB]%*1[\xBF]");

        for (int i = 0; i < 5 && fgets(buffer, sizeof buf, pf); i++) {
            k = sscanf(pf, "%d;%d;%d", &point[i][0], &point[i][1], &point[i][2]);
            for (int j = 0; j < k; j++) {
                printf("%d ", point[i][k]);
            }
            printf("\n");
        }
        fclose(pf);
    } else {
        perror("Couldn't load the PATH file");
    }
}