【问题标题】:Working with tokenizing in c在 c 中使用标记化
【发布时间】:2011-05-04 17:26:10
【问题描述】:

我正在尝试对一条线进行标记并将其放入一个二维数组中,到目前为止我已经想出了这个,但我觉得我离得很远:

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

【问题讨论】:

  • 我认为您可能需要编辑该帖子,因为问题似乎并不完整。
  • strtok 接受 2 个参数。您使用的是什么系统/语言(带有 3 个参数 strtok)?
  • 在 C 中,strtok 通常分两步使用:首先初始化 (strtok(INPUT_STRING, DELIMITERS)),然后在循环中抓取更多块 (strtok(NULL, DELIMITERS))。
  • strtokstrsep - 文档是你的朋友。
  • 如何列出多个分隔符?

标签: c pointers multidimensional-array strtok


【解决方案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");
}
}

希望这应该可行。

【讨论】:

  • 返回去哪里,如果我每次在数组中添加一个令牌时增加 num_tokens 是否也会进入 for 循环?您还可以将for循环中间的tokenPtr解释为条件吗?到目前为止也感谢您的帮助
  • 使用tokenPtr作为条件会导致循环在tokenPtrNULL时退出(这相当于C中的0或false)。
【解决方案2】:

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

【讨论】:

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

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

    【讨论】:

    • 对不起,我有点迂腐,但如果你存储的是单个字符串,那么它将是一个字符数组(不是 char*),或者可能只是一个 malloc'd char*。再说一次,标签确实说是多维的,所以一个 char* 数组可能是合适的。
    • @John,您对单个字符串是正确的。我正在考虑在哪里存储完整的令牌集。
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多