如何在 C 中解析标准输入?

How to parse stdin in C?

我使用 select() 来知道何时必须从标准输入读取。我称这个函数为:

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

我做错了什么?

这里的问题

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

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

  2. 通过对指针进行malloc()分配后,使用赋值=会导致内存泄漏。使用 strcpy() 复制 strtok() 返回的 token 到所需的指针。

移除

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

为什么?因为你 malloced 的记忆在这里丢失了:

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

strtokreturns一个char*。您更改指针指向的位置。这会导致 内存泄漏 ,因为您还没有 free 分配的内存。你不需要

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

一旦您删除了上述对 malloc 的三个调用。

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