我正在使用strtok
将字符串分割成标记。有没有人知道实际计算标记数量的函数?
我有一个命令字符串,需要将其拆分并将参数传递给execve()
。
谢谢!
编辑
execve
将参数作为char**
,因此我需要分配一个指针数组。 我不知道要分配多少个指针,除非知道有多少个标记。
一种方法是使用带有计数器的strtok
。但是,这会修改原始字符串。
另一种方法是在循环中使用strchr
,如下所示:
int count = 0;
char *ptr = s;
while((ptr = strchr(ptr, ' ')) != NULL) {
count++;
ptr++;
}
strpbrk
:while((ptr = strpbrk(ptr, " \t")) != NULL) ...
strpbrk
。 - nneonneostrpbrk
。感谢您的反馈。 - nneonneoptr
的先前值,并取两者之间的差异 - 指针指向同一字符串的不同部分。 - nneonneo由于令牌数实际上只是使用定界符的出现频率加1,因此您的问题归结为查找字符串中字符出现的次数。
假设在C语言的strtok函数中使用的定界符是' '
int count =0,i;
char str[20] = "some string here";
for(i=0;i<strlen(str);i++){
if(str[i] == ' ')
count++;
}
strtok()
不会将连续的分隔符视为单个分隔符吗? - jvriesem以下是基于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
strtok()
和增加计数器? - alexrealloc
应该解决不提前知道大小的问题。 - Kerrek SB