Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 斯特托克表现出不良行为_C_String_Pointers_Tokenize - Fatal编程技术网

C 斯特托克表现出不良行为

C 斯特托克表现出不良行为,c,string,pointers,tokenize,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,";")

以下是我的代码片段:

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个带分隔符
“;”的令牌,它将忽略b/w中的“null”值,而不将它们视为单独的标记

输出为:

Old String [123;;False;CXL;;true]
str[0] =[123]str[1] =[False]str[2] =[CXL]str[3] =[true]
New String [345;False;CXL;true]
有没有我不知道的解决方法

谢谢

函数的作用是替换strtok()函数 功能。而strtok()函数应优先用于 可移植性原因(符合ISO/IEC 9899:1990(“ISO C90”))it 无法处理空字段,即检测由两个字符分隔的字段 相邻的分隔符字符,或用于多个单个 一次串一根。strep()函数首次出现在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

strtok()
将连续分隔符视为一个分隔符。因此,无法解析空字段(在您的情况下,在连续的
之间)。最简单的解决方案:不要使用strtok()
谢谢,那么你能为这个问题提出其他建议吗?如果可用,请使用strep。是:1)使用循环手动遍历字符串2)使用strcr()或strspn()/
strcspn()
(或
strep()
tnx@BLUEPIXY)strhr还返回带分隔符的分隔符