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