C 我不理解strep()中的这个错误

C 我不理解strep()中的这个错误,c,string,strsep,C,String,Strsep,我会直截了当地说。我有一个函数,它从套接字读取命令字符串,然后将该字符串分解为一个结构: typedef struct{ char* command; char* option; } Command; 如果命令字符串中没有选项,command.option=NULL。出于此函数的目的,我们可以假设recv’d数据在套接字的另一端进行验证 以下是我遇到问题的函数: Command* getCommand(int cfd) { Command* commandStruct

我会直截了当地说。我有一个函数,它从套接字读取命令字符串,然后将该字符串分解为一个结构:

typedef struct{
    char* command;
    char* option;
} Command;
如果命令字符串中没有选项,command.option=NULL。出于此函数的目的,我们可以假设recv’d数据在套接字的另一端进行验证

以下是我遇到问题的函数:

Command* getCommand(int cfd)
{
    Command* commandStruct = (Command*) malloc(sizeof commandStruct);
    char cmdStr[200];
    char *running, *cmd, *option;
    char* delimeters = " ";

    memset(cmdStr, '\0', 200);
    memset(commandStruct, '\0', sizeof(commandStruct));

    if(recv(cfd, cmdStr, MAXLINE, 0) == -1) errExit("recv");
    verbosePrint(opts.v, "recv'd: %s\n", cmdStr);

    running = strdupa(cmdStr); 
    verbosePrint(opts.v, "copied string\n");

    cmd = strsep(&running, delimeters); //SEGFAULT OCCURRING HERE. WHY?
    verbosePrint(opts.v, "separated string\n");

    //If the string is longer than the one command then there's an option
    if(strlen(cmdStr) > strlen(cmd))
    {
        verbosePrint(opts.v, "recieved a command with an option");
        option = strsep(&running, delimeters);
        commandStruct->option = (char*) malloc(strlen(option));
        strcpy(commandStruct->option, option);
    } 

    commandStruct->command = (char*) malloc(strlen(cmd));
    strcpy(commandStruct->command, cmd);

    return commandStruct;
}
当我使用GDB时,我发现segfault发生在cmd=strep&running,delimeters;但我不知道为什么。GCC没有警告我指针无效,所以我认为这不是问题所在。我也使用strdup,所以在文字、数组或类似的傻事上写应该不会有任何问题。我真的被难倒了


而且,它只抱怨字符串中实际上有一个空格,即定界字符。单字命令工作正常。因此,我想知道问题是否出在strep试图用“\0”写入空间时?但是为什么会发生这种情况?

strep函数的返回类型是什么?是否确保所需的参数类型和获取输出的变量类型有效?@arun strep返回一个字符*,该字符与我的赋值匹配。如果有帮助的话,这里有一个原型:char*strespchar**stringp,const char*delim;就我所知,我正确地匹配了类型。基本上,strep执行以下操作:首先找到一个delimeter,然后用空终止符替换它,返回新的终止字符串,然后变异原始字符串,使其指向刚刚放置的空终止符。更多信息可在此处找到: