免费电话崩溃()

时间:2018-01-09 07:55:18

标签: c linux crash fopen fclose

我不明白为什么下面这段代码会让我的程序崩溃。 ' FP'在执行&futn()'。

之后没有被修改
    FILE * fp;
    char * line = NULL;
    int len = 0;
    int read;
    char filePath[100] = "";

    //Quick concatenate, I should use concatain but nah.
    snprintf(filePath,sizeof(filePath), "%s/%s/%s",FOLDER_MAIN, "test", "data.txt");
    fp = fopen(filePath, "r");
    if (fp != NULL)
    {
        while ((read = getline(&line, &len, fp)) != -1)
        {
            if(startsWith(line, "value:"))
            {
                removeSubstring(line, "value:");
                removeSubstring(line, " ");
                removeSubstring(line, "\t");
                removeSubstring(line, "\n");
                printf("%d\t%s\n", 0, line);
            }
        }
        fclose(fp);

        //Free line pointer, is it really needed ?
        if (line)
           free(line);
    }

int StartsWith(const char *a, const char *b)
{
   if(strncmp(a, b, strlen(b)) == 0)
       return 1;

   return 0;
}

void removeSubstring(char *s,const char *toremove)
{
    while( s=strstr(s,toremove))
        memmove(s,s+strlen(toremove),1+strlen(s+strlen(toremove)));
}

编辑: 此外,'免费(线)'也使程序崩溃。 我添加了removeSubstring和StartsWith函数,我希望它有所帮助。无论如何,我认为它对程序的影响很大,因为问题在于fp ...

1 个答案:

答案 0 :(得分:3)

您的代码是未定义的行为。

getline原型清晰ssize_t getline(char **lineptr, size_t *n, FILE *stream);,使用指针时必须使用正确类型!

size_t len = 0;
ssize_t read;

编译器应该警告你。