通过分隔符分割字符串

时间:2016-04-07 02:56:08

标签: c clion string.h

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

functions.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包括来纠正这个错误,但这也导致无济于事。 ... Output from the debugger..

1 个答案:

答案 0 :(得分:0)

问题得到解决,CMakeList.txt通过一些任意方式编辑,C编译标准也发生了变化。它改为c11,标准c11没有实现strdup()与标准c99使用的方式相同,它是用c99标准而不是c11编写的。