在c中使用标记化



我正在尝试将一行标记化并将其放入二维数组中到目前为止,我已经想到了这个,但我觉得我还远远不够:

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

您应该实现一个有限状态机,我刚刚完成了shell命令Lexer/Parser (LL)查看:如何手工编写(shell)词法分析器

  1. tokenPtr未初始化-它可能在第一次通过循环时为NULL,也可能不是NULL。
  2. strtok接受2个参数。如果您想分割多个字符,请将它们全部包含在第二个字符串中。
  3. 调用strtok后,令牌指针指向您想要的字符串。现在怎么办呢?你需要一个地方来储存它。可能是char*数组?或2d字符数组,如您编辑的原型
  4. tokens[i]是MAX_TOKEN_SIZE字符的存储空间。strtok()返回一个指向字符串(一个或多个字符的序列)的指针。您需要将其中一个复制到另一个。
  5. 内循环完成了什么?

注意char tokens[][MAX]通常被称为二维字符数组。(或固定长度字符串的一维数组)。一个二维字符串数组应该是char* token [][MAX]

相关内容

  • 没有找到相关文章

最新更新