代码片段:
char str[] = "String1::String2:String3:String4::String5";
char *deli = "::";
char *token = strtok(str,deli);
while(token != NULL)
{
printf("Token= \"%s\"\n", token);
token=strtok(NULL,deli);
}
上面的代码片段产生输出:
Token="String1"
Token="String2"
Token="String3"
Token="String4"
Token="String5"
但我希望输出是:
Token="String1"
Token="String2:String3:String4"
Token="String5"
我知道我没有得到预期的输出,因为每个字符在第二个参数中strtok
被视为分隔符。
为了获得预期的输出,我编写了一个使用strstr
(和其他东西)将给定的字符串拆分为标记,以便我获得预期的输出。这是程序:
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int myStrtok(char* str,char* deli)
{
if(str==NULL || deli==NULL)
return -1;
int tokens=0;
char *token;
char *output=str;
while((token=strstr(output,deli))!=NULL)
{
bool print=true;
if(output != token)
{
printf("Token = \"");
tokens++;
print=false;
}
while(output != token)
{
putchar(*output);
output++;
}
if(print==false)
printf("\"\n");
output+=strlen(deli);
}
if(strlen(output)>0)
{
printf("Token = \"%s\"",output);
tokens++;
}
printf("\n\n");
return tokens;
}
int main(void)
{
char str[]="One:1:Two::Three::::";
char *deli="::";
int retval;
printf("Original string=\"%s\"\n\n",str);
if((retval=myStrtok(str,deli))==-1)
printf("The string or the delimeter is NULL\n");
else
printf("Number of tokens=%d\n", retval);
return(EXIT_SUCCESS);
}
上述程序产生预期的输出。
我想知道是否有更简单/更简单的方法可以做到这一点。有吗?