在c中使用标记化

时间:2011-05-04 17:26:10

标签: c pointers multidimensional-array strtok

我试图将一条线标记化并将其放入一个二维数组中,到目前为止我已经想出了这个但是我觉得我很遥远:

/**
 * 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 个答案:

答案 0 :(得分:1)

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");
}
}

希望这应该有用。

答案 1 :(得分:0)

  1. tokenPtr未初始化 - 第一次循环时它可能是也可能不是NULL。
  2. strtok需要2个参数。如果要拆分多个字符,请将它们全部包含在第二个字符串中。
  3. strtok调用之后,令牌指针指向您想要的字符串。怎么办?你需要一个地方来存储它。 也许是char *? 的数组或者是2d数组的字符,就像你编辑的原型一样。
  4. tokens[i]是MAX_TOKEN_SIZE个字符的存储空间。 strtok()返回指向字符串的指针(一个包含1个或多个字符的序列)。你需要将一个复制到另一个。
  5. 什么是内循环完成?
  6. 请注意,char tokens[][MAX]通常称为二维字符数组。 (或固定长度字符串的一维数组)。二维字符串数组是char * tokens [] [MAX]

答案 2 :(得分:0)

你应该实现一个有限状态机,我刚刚完成我的shell命令Lexer / Parser(LL) 看:How to write a (shell) lexer by hand