如何在C中解析stdin?

时间:2015-04-07 11:42:35

标签: c fgets

我使用select()知道何时必须从stdin读取。我称这个函数为:

void
CLI()
{
    char *line=(char*)malloc(sizeof(char)*32);
    char *cmd=(char*)malloc(sizeof(char)*16);
    char *arg1=(char*)malloc(sizeof(char)*8);
    char *arg2=(char*)malloc(sizeof(char)*8);

    while(fgets(line, sizeof(line), stdin) != NULL)
    {
        cmd=strtok(line," \n\r\t");
        arg1=strtok(NULL," \n\r\t");
        arg2=strtok(NULL," \n\r\t");

        if(cmd==NULL) break;

        printf("cmd=%s, arg1=%s, arg2=%s",cmd,arg1,arg2);
    }
    free(line);
    free(cmd);
    free(arg1);
    free(arg2);
}

输入示例:#set PAR 0

我得到了什么:

*** Error in './myprogram': double free or corruption (fasttop): 0x0000000001cc70f0 ***

我做错了什么?

2 个答案:

答案 0 :(得分:3)

此处的问题是

  1. fgets(line, sizeof(line), stdin,不,这不是你想要的。 sizeof()返回数据类型的大小,而不是指针指向的区域。您必须通过该指针提供可用的内存量,例如

    while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted

  2. 通过对指针执行malloc()分配后,使用赋值=会导致内存泄漏。使用strcpy()代替将<{em>} strtok()返回到所需指针。

答案 1 :(得分:1)

删除

char *cmd=(char*)malloc(sizeof(char)*16);
char *arg1=(char*)malloc(sizeof(char)*8);
char *arg2=(char*)malloc(sizeof(char)*8);

为什么呢?因为你malloc ed的内存在这里丢失了:

cmd=strtok(line," \n\r\t");
arg1=strtok(NULL," \n\r\t");
arg2=strtok(NULL," \n\r\t");

strtok返回char*。您可以更改指针指向的位置。这会导致内存泄漏,因为您没有free已分配的内存。你不需要

free(cmd);
free(arg1);
free(arg2);

如上所述删除了对malloc的三次调用。

此外,Don't cast the result of malloc and family。请注意sizeof(char)为1,因为它与malloc中不需要的其他数字相乘。