13

strtok用来将字符串拆分为标记。有谁知道任何实际计算令牌数量的函数?

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

谢谢!

编辑

execve将参数作为char**,所以我需要分配一个指针数组。在不知道有多少令牌的情况下,我不知道要分配多少。

4

3 回答 3

10

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

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

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

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

while((ptr = strpbrk(ptr, " \t")) != NULL) ...
于 2012-10-25T23:54:25.610 回答
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 相同

于 2014-10-15T14:39:46.640 回答
1

这是一个基于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
于 2019-01-30T10:10:30.250 回答