Ошибка сегмента при попытке использовать strtok () в двумерном массиве - PullRequest
1 голос
/ 27 сентября 2011

Я надеялся, что кто-нибудь может помочь мне понять, почему я получаю ошибку сегментации в моем коде ниже.Мой пользователь ввел строку текста, которая передается в функцию анализа.Функция синтаксического анализа должна инициализировать 2D-массив (в идеале я хотел бы динамически распределить массив, но сейчас я делаю его массивом размера [25] [25]).

Начиная с начала input вызывается strtok ().Если strtok () видит символ канала, он должен увеличить количество каналов и перейти к следующему ряду матрицы.Например, если пользователь ввел foo bar | foo1 | foo2 bar1 foo2, 2D-массив будет выглядеть следующим образом:

array[][] = { foo, barr;
              foo1;
              foo2, bar1, foo2; }

В конце концов, я хотел бы передать этот массив другой функции.Однако, если я на самом деле ввожу вышеупомянутое в свою программу, это будет результат:

/home/ad/Documents> foo bar | foo1 | foo2 bar1 foo2
test1
Segmentation fault
ad@ad-laptop:~/Documents$

Таким образом, учитывая, куда я помещаю эти операторы отладки, проблема заключается в сохранении токенов?Это первый раз, когда я работал с двумерным массивом, поэтому я уверен, что с моей логикой указателя что-то не так.Что я могу сделать, чтобы исправить эту ошибку сегментации?Спасибо за ваше время.

Код:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int MAX_PATH_LENGTH = 1024; //Maximum path length to display.
int BUF_LENGTH = 1024; // Length of buffer to store user input
char * delims = "|"; // Delimiters for tokenizing user input.
const int PIPE_READ = 0;
const int PIPE_WRITE = 1;

void execute(char *args, int numPipes, int numArgs){
    int i;
    int j;
    for(i = 0; i <= numArgs; i++){
        for(j = 0; j < 25; j++){
            printf("args[%d][%d]", i, j);
        }
    }
}


void parse(char *input) { 
    char argArray[25][25];
    int numPipes = 0;
    int i = 0;
    int j = 0;
    char *tokenPtr = NULL;
    tokenPtr = strtok(input, delims);
    while(tokenPtr != NULL) {
        if(strcmp(tokenPtr, "|") == 0){ //is token a pipe?
            numPipes++;
            i++;
            j = 0;
        }
        else {
            argArray[i][j++] = *tokenPtr;
            printf("test1\n");
            tokenPtr = strtok(input, NULL);
            printf("test2\n");
        }
    }
    execute(*argArray, numPipes, i);
}

int main () {

    char path[MAX_PATH_LENGTH];
    char buf[BUF_LENGTH];
    char* strArray[BUF_LENGTH];

    while(1) {
      getcwd(path, MAX_PATH_LENGTH);
      printf("%s> ", path);
      fflush(stdout);
      fgets(buf, BUF_LENGTH, stdin);
      parse(buf);

      bzero(strArray, sizeof(strArray)); // clears array
   }
}

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Только первый вызов strtok должен получить ввод.Последующие вызовы (при разборе одной и той же строки) должны иметь значение NULL в качестве первого аргумента.

1 голос
/ 27 сентября 2011

Вы неправильно прочитали man-страницу для strtok:

При каждом последующем вызове, который должен анализировать одну и ту же строку, str должно быть NULL.

И вы сделали: tokenPtr = strtok(input, NULL);

...