C strtok的重用将导致null

C strtok的重用将导致null,c,linux,C,Linux,例如: #include<stdio.h> #include<string.h> int main() { char str[1024]; char *buff,*temp, *result=NULL; char tok[]=" "; printf("enter string:\n"); gets(str); buff=str;

例如:

  #include<stdio.h>
  #include<string.h>


  int main()

  {
          char str[1024];
          char *buff,*temp, *result=NULL;
          char tok[]=" ";
          printf("enter string:\n");
          gets(str);

          buff=str;


          result= strtok(buff,tok);

          while(result != NULL) 
          {       
                  printf("%s\n",result);
                  result = strtok(NULL,tok);

          }   


 printf("\n");

          char tok1[]= " ";
          temp=str;
          result= strtok(temp,tok1);

          while(result != NULL) 
          {       
                  printf("%s\n",result);
                  result = strtok(NULL,tok1);

          }   



  }
 **Output coming :**    



enter string:
     Hello   how  are you
     Hello
     how
     are
     you

     Hello


   **But It should give:**



enter string:
Hello   how  are you
Hello
how
are
you

Hello
how
are
you  
#包括
#包括
int main()
{
char-str[1024];
char*buff,*temp,*result=NULL;
char-tok[]=“”;
printf(“输入字符串:\n”);
获取(str);
buff=str;
结果=strtok(buff,tok);
while(结果!=NULL)
{       
printf(“%s\n”,结果);
结果=strtok(空,tok);
}   
printf(“\n”);
char tok1[]=“”;
temp=str;
结果=strtok(温度,tok1);
while(结果!=NULL)
{       
printf(“%s\n”,结果);
结果=strtok(空,tok1);
}   
}
**输出:**
输入字符串:
你好,你好吗
你好
怎样
是
你
你好
**但它应该给出:**
输入字符串:
你好,你好吗
你好
怎样
是
你
你好
怎样
是
你
为什么strtok在打印第一个单词(即hello)后给出空值。 我正在使用另一个变量,也在初始化它,也在使用另一个令牌变量,如何得到期望的结果?strtok()修改输入字符串时需要使用strtok吗。因此,在第一轮标记化之后,原始字符串
str
已被修改(因为
temp
指向
str

因此,在将字符串传递给
strtok()
之前,先复制一份字符串

其他改进:

1) 不要使用已弃用的
get()
。使用
fgets()
来避免潜在的缓冲区溢出。
2) 使用
strtok_r()
,因为它是重新进入者

strtok()
修改输入字符串。因此,在第一轮标记化之后,原始字符串
str
已被修改(因为
temp
指向
str

因此,在将字符串传递给
strtok()
之前,先复制一份字符串

其他改进:

1) 不要使用已弃用的
get()
。使用
fgets()
来避免潜在的缓冲区溢出。

2) 使用
strtok_r()
,因为它是重新进入者

但我在斯特托克没有用str。。我使用了buff。@user3065636:
buff
是一个
char*
,这意味着它的值只是指向
str
开头的指针(str中第一个字符的内存地址)。所以
buff
只是指向
str
,这就是
strtok
正在改变的here@user3065636正如Elias提到的,它只是指向
str
。将其声明为
temp
as
char-temp[1024]和do
strcpy(临时、str)在阅读
str
之后,您将看到差异。是的
strtok_r()
不是ISO的一部分,而是POSIX标准的一部分。@user2482551可能更有效,但也更危险,正如这个问题所显示的,另外一个事实是,您不能传递常量指针,例如字符串,但我在strtok中没有使用str。。我使用了buff。@user3065636:
buff
是一个
char*
,这意味着它的值只是指向
str
开头的指针(str
中第一个字符的内存地址)。所以
buff
只是指向
str
,这就是
strtok
正在改变的here@user3065636正如Elias提到的,它只是指向
str
。将其声明为
temp
as
char-temp[1024]和do
strcpy(临时、str)在阅读
str
之后,您将看到差异。是的
strtok_r()
不是ISO的一部分,而是POSIX标准的一部分。@user2482551可能更有效,但也更危险,正如这个问题所显示的,再加上不能传递常量指针,例如字符串文本