有没有办法计算C中的令牌?

时间:2012-10-25 23:42:56

标签: c token delimiter strtok

我正在使用strtok将字符串拆分为标记。有没有人知道任何实际计算令牌数量的函数?

我有一个命令字符串,我需要拆分它并将参数传递给execve()

谢谢!

修改

execve将参数作为char**,因此我需要分配一个指针数组。我不知道有多少分配而不知道有多少令牌。

3 个答案:

答案 0 :(得分:8)

一种方法是简单地将strtok与计数器一起使用。但是,这将修改原始字符串。

另一种方法是在循环中使用strchr,如下所示:

int count = 0;
char *ptr = s;
while((ptr = strchr(ptr, ' ')) != NULL) {
    count++;
    ptr++;
}

如果您有多个分隔符,请使用strpbrk

while((ptr = strpbrk(ptr, " \t")) != NULL) ...

答案 1 :(得分:4)

因为令牌的数量只不过是所使用的定界符的出现频率。所以你的问题归结为找不到。字符串中出现字符的次数

说c中的strtok函数中使用的分隔符是''

int count =0,i;
char str[20] = "some string here";

for(i=0;i<strlen(str);i++){
    if(str[i] == ' ')
        count++;
}

没有。令牌与count + 1相同

答案 2 :(得分:0)

这里是基于strtok的版本,它不会修改原始字符串,而是临时的副本。该版本适用于用作标记分隔符的制表符和空格字符的任何组合。功能是

unsigned long int getNofTokens(const char* string){
  char* stringCopy;
  unsigned long int stringLength;
  unsigned long int count = 0;

  stringLength = (unsigned)strlen(string);
  stringCopy = malloc((stringLength+1)*sizeof(char));
  strcpy(stringCopy,string);

  if( strtok(stringCopy, " \t") != NULL){
    count++;
    while( strtok(NULL," \t") != NULL )
        count++;
  }

  free(stringCopy);
  return count;
}

一个函数调用可能是

char stringExample[]=" wordA 25.4 \t 5.6e-3\t\twordB 4.5e005\t ";
printf("number of elements in stringExample is %lu",getNofTokens(stringExample));

输出为

number of elements in stringExample is 5