0

我一直在尝试创建自己的 shell 程序,我一直在看的教程建议使用strtok()函数。虽然,我无法简单地解析我的命令行并且我不确定我做错了什么。在parseCmd()函数中第一次使用strtok()期间,我不断收到分段错误。

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define MAXSIZE 512

int parseCmd(char *cmd, char *args[])
{
    printf("LOGGER: parseCmd(cmd=%s, args=%p)\n", cmd, args);

    char cmdDelims[] = " >";

    char *cmdReader;
    cmdReader = strtok(cmd, cmdDelims);

    printf("LOGGER: cmdReader=%s\n", cmdReader);

    int i = 0;
    while (cmd != NULL)
    {
        printf("LOGGER: %d counter", i);

        args[i] = strdup(cmdReader);
        cmdReader = strtok(NULL, " >");
        i++;
    }
}

int main() 
{   
    char *in;
    in = malloc(MAXSIZE);

    char *args[10];
    char *cmd = NULL;

    int errorBit = 0;
    int terminationBit = 1;

    char inDelims[] = "\n";

    while (terminationBit)
    {
        printf("mysh>");
        fgets(in, MAXSIZE, stdin);

        cmd = strtok(in, inDelims);

        errorBit = parseCmd(cmd, args);
        if (errorBit)
        {
            fprintf(stderr, "Error: Cannot parse command %s\n", cmd);
            exit(1);
        }

        if (*args == "exit")
        {
            terminationBit = 0;
        }
    }
    return 0;
}

任何有关此主题的帮助或建议将不胜感激。

编辑:根据输出,实际段错误可能不是 strtok()

这是一些输出:

mysh>hi sup
LOGGER: parseCmd(cmd=hi sup, args=0x7fff50ec0b80)
LOGGER: cmdReader=hi
Segmentation fault: 11
4

1 回答 1

1

似乎是一个简单的错误:

while (cmd != NULL)
{
    // ...
}

...应该是:

while (cmdReader != NULL)
{
    // ...
}

...因为cmd很可能永远不会成为NULL. 另外,这个:

if (*args == "exit")
{
    terminationBit = 0;
}

...可能不会按照你的想法去做。要比较字符串,请使用:

if (strcmp(*args, "exit") == 0)
{
    terminationBit = 0;
}

您必须确保它也parseCmd返回一些东西,否则:

errorBit = parseCmd(cmd, args);

...parseCmd产生未定义的行为,因此 的值errorBit也完全未定义,随后检查其值的条件也是如此。

最后,您的程序实际上将在您之后泄漏内存strdup并且malloc永远不会释放。free完成后不要忘记args

于 2012-10-03T13:14:09.650 回答