0

我正在用纯 C编写一个程序(我的年终课程项目的要求)。它有一个存储 csv 值的.dat文件。我找到了一个逐行读取文件的函数和一个通过分隔符从文件中拆分行的函数,字符串拆分函数工作得非常好,直到 IDE 发生变化。我有 JetBrains 的学生许可证,最近买了一台 64 位笔记本电脑,所以我升级到了 CLion。然后开始遇到特定代码的问题,当它到达那行代码时,它会挂起我的程序,更具体地说,是在读取字符串中的最终分隔符时。

函数.c::str_split

char** str_split(char* a_str, const char a_delim)
{
    char** result    = 0;
    size_t count     = 0;
    char* tmp        = a_str;
    char* last_comma = 0;
    char delim[2];
    delim[0] = a_delim;
    delim[1] = 0;

    /* Count how many elements will be extracted. */
    while (*tmp)
    {
        if (a_delim == *tmp)
        {
            count++;
            last_comma = tmp;
        }
        tmp++;
    }

    /* Add space for trailing token. */
    count += last_comma < (a_str + strlen(a_str) - 1);

    /* Add space for terminating null string so caller
       knows where the list of returned strings ends. */
    count++;

    result = malloc(sizeof(char*) * count);

    if (result)
    {
        size_t idx  = 0;
        char* token = strtok(a_str, delim);

        while (token)
        {
            assert(idx < count);
            *(result + idx++)= strdup(token);
            token = strtok(0, delim);
        }
        assert(idx == count - 1);
        *(result + idx) = 0;
    }

    return result;
}

它在main.c::main中是这样调用的

...
while ((read =(size_t)getline(&file_line, &len, fp)) != -1) {
       char **tokens;
       tokens = str_split(file_line, ',');
...

程序挂在这条线上...没有抛出错误,但是当 GDB 调试器显示停止时,IDE 还尝试通过建议一个可能提供帮助的 lib 包含来纠正此错误,但这也无济于事...。 调试器的输出..

4

1 回答 1

0

问题已得到纠正,CMakeList.txt 被任意编辑,C 编译标准被更改。它已更改为 c11,标准 c11 没有以标准 c99 使用的相同方式实现 strdup(),它是使用 c99 标准而不是 c11 编写的。

于 2016-04-07T14:44:48.047 回答