Работа с токенизацией в c - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь токенизировать линию и поместить ее в двумерный массив, так что до сих пор я придумал это, но я чувствую, что я далеко:

/**
 * Function to tokenize an input line into seperate tokens
 *
 * The first arg is the line to be tokenized and the second arg points to
 * a 2-dimentional string array. The number of rows of this array should be
 * at least MAX_TOKENS_PER_LINE size, and the number of columns (i.e., length
 * of each string should be at least MAX_TOKEN_SIZE)
 *
 * Returns 0 on success and negative number on failure
 */

int __tokenize(char *line, char tokens[][MAX_TOKEN_SIZE], int *num_tokens){

char *tokenPtr;
tokenPtr = strtok(line, " \t");
    for(int j =0; j<MAX_TOKEN_SIZE; j++){
      while(tokenPtr != NULL){
        if(!(tokens[][j] = tokenPtr)){return -1;}
            num_tokens++;
            tokenPtr = strtok(NULL, " \t");
        }
    }
  return 0;
}

Ответы [ 3 ]

1 голос
/ 04 мая 2011
int __tokenize(char *line, char tokens[][MAX_TOKEN_SIZE], int *num_tokens)
{
char *tokenPtr;
tokenPtr = strtok(line, " \t");
for (int i = 0; tokenPtr; i++)
{
            tokens[i] = tokenPtr;
            tokenPtr = strtok(NULL, " \t");
}
}

Надеюсь, это сработает.

0 голосов
/ 04 мая 2011

Вы должны реализовать конечный автомат, я только что закончил свою команду оболочки Lexer / Parser (LL) Посмотрите: Как написать лексер (shell) вручную

0 голосов
/ 04 мая 2011
  1. tokenPtr не инициализировано - оно может быть или не быть NULL в первый раз в цикле.
  2. strtok принимает 2 аргумента.Если вы хотите разделить несколько символов, включите их все во 2-ю строку.
  3. После вызова strtok указатель токена указывает на нужную строку.Что теперь?Вам нужно где-то хранить это. Возможно, массив char *? Или двумерный массив символов, как в отредактированном прототипе .
  4. tokens[i] - это хранилище для символов MAX_TOKEN_SIZE.strtok() возвращает указатель на строку (последовательность из 1 или более символов).Вам нужно скопировать одно в другое.
  5. Что выполняет внутренний цикл?

Обратите внимание, что char tokens[][MAX] обычно называют двумерным массивом символов.(или одномерный массив строк фиксированной длины).2-D массив строк будет char * tokens [] [MAX]

...