我不明白strsep()中的这个段错误

时间:2014-12-06 20:38:31

标签: c string strsep

我会说得对。我有一个从套接字读取命令字符串的函数,然后将该字符串分解为结构:

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时,我发现段错误发生在cmd = strsep(&running, delimeters);,但我不确定原因。 GCC没有警告我有关无效指针的信息,所以我认为这不是问题所在。我strdup()也是如此,所以写文字或数组或任何愚蠢的东西不应该有任何问题。老实说,我很难过。

此外,它只会抱怨实际上有空格的字符串(这是分隔字符)。单字命令工作正常。所以我想知道问题是当strsep尝试用'\ 0'写空间时?但为什么会这样呢?

0 个答案:

没有答案