strtok表现出不良行为

时间:2017-08-23 08:27:46

标签: c string pointers tokenize

以下是我的代码片段:

int main()
{
   char *str[4];
   char *ptr;

   char Str[25];
   char Str1[25];
   memset(Str,32,25);
   char temp[25];
   sprintf(Str,"123;;False;CXL;;true");
   printf("Old String [%s]",Str);
   ptr = &Str ;
   str[0]=strtok(ptr,";");
   str[1]=strtok(NULL,";");
   str[2]=strtok(NULL,";");
   str[3]=strtok(NULL,";");

   printf("str[0] =[%s]",str[0]);
   printf("str[1] =[%s]",str[1]);
   printf("str[2] =[%s]",str[2]);
   printf("str[3] =[%s]",str[3]);

   //strncpy(temp,str,25);
   memcpy(str[0],"345",3);
   sprintf(Str1,"%s;%s;%s;%s",str[0],str[1],str[2],str[3]);
   printf("New String [%s]",Str1);
   return 0;
}

我担心的是为什么它忽略了' null'原始字符串中的值?根据输出我得到4个令牌,但实际上我有6个带有分隔符';'的令牌,它忽略了' null' b / w中的值,而不是将它们视为单独的令牌。

输出是:

Old String [123;;False;CXL;;true]
str[0] =[123]str[1] =[False]str[2] =[CXL]str[3] =[true]
New String [345;False;CXL;true]

是否有针对此的解决方法,我不知道?

谢谢!

1 个答案:

答案 0 :(得分:3)

strsep MAN

  

strsep()函数旨在替代strtok()   功能。虽然strtok()函数应该是首选   便携性原因(它符合ISO / IEC 9899:1990(“ISO C90”))   无法处理空字段,即检测由2分隔的字段   相邻的分隔符,或者用于多个分隔符   一次一个字符串。 strsep()函数首先出现在4.4BSD中。

示例

char *t, *str, *save;

save = str = strdup("123;;False;CXL;;true");
while ((t = strsep(&str, ";")) != NULL)
    printf("Token=%s\n", t);

free(save);

<强>输出

Token=123
Token=
Token=False
Token=CXL
Token=
Token=true