Ошибка сегментации: Использование strtok, системные вызовы.C программирование - PullRequest
0 голосов
/ 02 февраля 2019

В настоящее время я пытаюсь выполнить strtok два раза, чтобы токенизировать все команды, передаваемые файлом.Первый раунд токенизации работает, но затем я получаю ошибку сегментации.Что это может быть?Я пытался уменьшить размер всех массивов, потому что думал, что это проблема с памятью.Это также запрограммировано в C, и я не получаю никаких ошибок или предупреждений.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{
        char content[100];
        int fd;
        ssize_t bytes = 0;
        fd = open(argv[1], O_RDONLY);
        int i = 0;

        char* token;
        const char a[2] = "\n";
        const char b[2] = " ";
        char storage[20][20];
        char temp[20][20];
        bytes = read(fd, content, sizeof(content)-1);
        close(fd);

        if(fd < 0)
        {
                write(1, "File doesn't exist\n", 19);
                return 1;
        }


        token = strtok(content, a);
        strcpy(storage[0],token);
        printf("%s\n",storage[0]);

        while(token != NULL)
        {
        i++;
        token = strtok(NULL, a);
        strcpy(storage[i],token);
        printf("%s\n",storage[i]);
        }

      token = strtok(storage[0],b);
        strcpy(temp[0], token);
        printf("%s\n",temp[0]);
        i = 0;

        while(token != NULL)
        {
        i++;
        token = strtok(NULL, b);
        strcpy(temp[i],token);
        printf("%s\n",temp[i]);

        }





return 0;

}

Это вывод, который я получаю:

/bin/ls -l 
/bin/cat command.txt 
/usr/bin/wc -l -w command.txt 
??
Segmentation fault

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Ошибка сегментации возникает, когда ваша программа пытается получить доступ к областям памяти за пределами того, что выделено вашей программе.Поскольку у вас есть только выделенный массив размером 20 для хранения и хранения большего, это проблема.Также вы выделили массив размером 20 для хранения токенов в строке, чего может быть недостаточно в зависимости от количества токенов в строке.Помимо них, как и другие упомянутые, вам также необходимо проверить, возвращает ли strtok значение null.Попытка отменить защиту нулевого указателя также может вызвать ошибку сегментации

0 голосов
/ 02 февраля 2019
    strcpy(storage[0],token);
    printf("%s\n",storage[0]);

Вы делаете то же самое в 4 или 5 случаях.Вам нужно проверить, если token не NULL.В противном случае ваша программа - это просто UB

if( token)
{
    strcpy(storage[0],token);
    printf("%s\n",storage[0]);
}
else
{
    /* do something if token is NULL */
}

, вы также можете реорганизовать свои циклы (это первый пример):

    token = strtok(content, a);
    i = 0;

    while(token != NULL)
    {
    strcpy(storage[i],token);
    printf("%s\n",storage[i++]);
    token = strtok(NULL, a);
    }
...