Командный синтаксический анализ оболочки UNIX C - PullRequest
0 голосов
/ 20 октября 2011

Я пытался создать программу, в которой я мог бы анализировать вводимые пользователем команды и параметры в определенные массивы (эти команды и параметры выполняли бы такие команды, как "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 после того, как все входы введены в массивы. Я могу успешно ввести правильные строковые элементы в массивы, но я просто не могу выйти из цикла, как только я это сделал.

1 Ответ

3 голосов
/ 20 октября 2011

strtok может возвращать нулевые указатели, если не найдено больше токенов. Таким образом, вы должны проверить значение cp перед его использованием:

cp = strtok(NULL, hash);
if (cp != NULL)
{
    ........
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...