我用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 ***

我做错什么了?

最佳答案

这里的问题是
fgets(line, sizeof(line), stdin,不,那不是你想要的。sizeof()返回数据类型的大小,而不是指针指向的区域。您必须通过指针提供可用的内存量,例如
while(fgets(line, 32 , stdin) != NULL) //sizeof(char) == 1, can be ommitted
在对指针执行malloc()分配之后,使用assignment=会导致内存泄漏。使用strcpy()strtok()返回的令牌复制到所需的指针。

关于c - 如何在C中解析stdin?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29490753/

10-11 23:03
查看更多