繁体   English   中英

C令牌化字符串

[英]C Tokenize String

我试图在保留分隔符的同时用分隔符标记字符串。 我尝试使用strtok(string, delimiters)但是该函数未保留定界符。 例如,如果我的字符串是:

"my name < is|John >hi"

当我看到符号"space", "<", ">"时,我想拆分。

令牌将是:

my, space, name, space, < , space, is, |, John, space, <, hi

最初,我尝试逐字符读取char,直到看到分隔符。 如果没有看到符号,则将read char附加到字符串之前。 例如,对于字符串“ hi | bye”。 我会读“ h”,然后读下一个字符。 其为“ i”,因此将其附加到“ h”。 阅读下一个符号,它是一个定界符,因此将“ hi”放入数组中,还将“ |”放入数组中 排列成一个数组。 重复直到完成。 我遇到了这样做的问题。

这是我的代码不起作用:

int main()
{
  char *line = "command1 | command2 command3 > command4 < command5";
  do_tokenize(line);
  return 0;
}
void do_tokenize(char *line)
{
  char *tokenized[100];
  char token[100];
  int tokenCounter = 0;
  int tokenLength = 0;
  int i;
  int newToken = 1;
  int tokenNum = 0;
  for(i=0; line[i] !='\0'; i++)
    {
      if(line[i] != ' ' && line[i] != '<' && line[i] != '>' && line[i] != '|')
    {
      token[tokenLength] = line[i];
      tokenLength++;
      newToken = 1;
    }
      else
    {
      if(newToken == 1)
        {
          token[tokenLength] = '\0';
          tokenized[tokenNum] = token;
          tokenLength = 0;
          tokenNum++;
          newToken = 0;

          token[tokenLength] = line[i];
          token[tokenLength+1] = '\0';
          tokenized[tokenNum] = token;
          tokenLength = 0;
          tokenNum++;
        } 
      else
        {
          token[tokenLength] = line[i];
          token[tokenLength+1] = '\0';
          tokenized[tokenNum] = token;
          tokenLength = 0;
          tokenNum++;
          newToken = 0;
        }
    }//end else
    }//end for

  token[tokenLength] = '\0';
  tokenized[tokenNum] = token;
  tokenNum++;

  //print is saying that all of tokenized[j] is the last token ie command5
  int j=0;
  for(j; j<tokenNum; j++)
    printf("%s\n", tokenized[j]);

}

当我尝试打印出整个数组(tokenized [j])时,它说的只是最后一个标记"command5" 这是用C完成的。

这将是一个在调试器中运行的好程序,它可以了解它的作用以及如何出错。

如果您使用某种类型的IDE(集成开发环境),则可能要做的就是按下“进入”按钮。

如果使用的是gcc,则可以通过在gcc命令中添加-g来轻松使用gdb:

$ gcc -g myprog.c -o myprog
$ gdb myprog
(gdb) start
Temporary breakpoint 1 at 0x4009d1
Starting program: myprog 

Temporary breakpoint 1, 0x00000000004009d1 in main ()
(gdb) step
Single stepping until exit from function main,
which has no line number information.
 ...

看来您希望令牌化数组的元素指向在“行”中找到的每个令牌。 代码忠实地将令牌的每个字符复制到char数组“令牌”。 将整个令牌加载到“令牌”中后,该令牌将终止为零。

-

所有这些都很好。 但是,下一步似乎是代码存在缺陷的地方。 然后将标记化数组中的下一个ponter指向“ token”。 问题是“令牌”是您的工作存储,并且“令牌”的内容针对每个新令牌重新生成。

-

最后,“ tokenize”数组中所有受影响的指针都指向同一位置;具体地说,它们都指向“ token”,当然,“ token”的内容是最后解析的令牌。

-

因此,在打印出“令牌”数组时,它们都指向“令牌”,并且令牌的内容是最后解析的令牌(“ Command5”)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM