【问题标题】:Command parsing UNIX shell C命令解析 UNIX shell C
【发布时间】:2011-12-11 14:37:03
【问题描述】:

我试图创建一个程序,我可以将用户输入的命令和参数解析为特定的数组(这些命令和参数将执行诸如“ls”、“ls -l”、“ls -l | wc " 但是,我在解析时遇到问题:

        //Split the command and store each string in parameter[]
    cp = (strtok(command, hash));                      //Get the initial string (the command)
    parameter[0] = (char*) malloc(strlen(cp)+ 1);                     //Allocate some space to the first element in the array
    strncpy(parameter[0], cp, strlen(cp)+ 1);
    for(i = 1; i < MAX_ARG; i++)
    {
    cp = strtok(NULL, hash);                 //Check for each string in the array
    parameter[i] = (char*) malloc(strlen(cp)+ 1);
    strncpy(parameter[i], cp, strlen(cp)+ 1);                      //Store the result string in an indexed off array
        if(parameter[i]  == NULL)
        {
            break;
        }
    if(strcmp(parameter[i], "|") == 0)
    {
        cp = strtok(NULL, hash);
        parameter2[0] = (char*) malloc(strlen(cp)+ 1);
        strncpy(parameter2[0], cp, strlen(cp)+ 1);
        //Find the second set of commands and parameters
        for (j = 1; j < MAX_ARG; j++)
        {
            cp = strtok(NULL, hash);
            if (cp == NULL)
            {
                leave = 1;
                break;
            }
            else
            {
                parameter2[j] = (char*) malloc(strlen(cp)+ 1);
                strncpy(parameter2[j], cp, strlen(cp)+ 1);
            }

        }
    }
    if (leave == 1)
    {
        break;
    }
}

我在执行 if (strlen(cp) == NULL) 时遇到问题,存在分段错误。 一旦所有输入都输入到数组中,我就试图打破更大的 for 循环。我可以成功地将正确的字符串元素输入到数组中,但是一旦完成,我就无法退出循环。

【问题讨论】:

    标签: c parsing shell unix command


    【解决方案1】:

    strtok如果找不到更多令牌,可能会返回 NULL 指针。因此,您必须在使用之前检查cp 的值:

    cp = strtok(NULL, hash);
    if (cp != NULL)
    {
        ........
    }
    

    【讨论】:

    • 我仍然遇到分段错误。问题是,例如,在存储最后一个元素之后, cp 指向一个垃圾元素。例如(“我的名字是 josh | 我在大学),程序可以正确地将所有令牌存储在正确的位置,但是一旦它在大学结束时,它会获得一个抓取值,这就是它应该离开的地方循环...这就是我想要做的
    • 但是,如果cp == NULL 你必须打破循环。你在做这个吗?
    • 是的,每当我这样做时,我都会收到分段错误...这是 SIGSEGV 分段错误
    • hash 和MAX_ARG 的值是哪个?给我一个你输入的例子
    • 很抱歉我是程序的另一部分导致了错误(break 语句没有跳出最外层循环)
    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多