对于strtok
返回的字符串,最后是否有\0
?
或者它不像strncpy
函数那样?
我会通过将strtok
的返回值复制到另一个带strcpy
的字符串数组来检查,但后来我不知道附加的\0
是否是{{1}的效果或strtok
(因为strcpy
确实添加了strcpy
)。
编辑:抱歉,我无法“将\0
的返回值复制到另一个strtok
字符串数组”。
答案 0 :(得分:10)
令牌的这一端自动被空字符替换, 并且函数返回令牌的开头。
答案 1 :(得分:5)
来自C99 7.24.5.8
然后strtok函数从那里搜索包含在中的字符 当前分隔符字符串如果找不到这样的字符,则当前令牌扩展到 s1指向的字符串的结尾,随后对标记的搜索将返回null 指针。如果找到这样的字符,会被空字符覆盖,这就是 终止当前令牌。 strtok函数保存指向以下内容的指针 字符,从中开始下一次搜索令牌。
答案 2 :(得分:1)
是的,strtok
返回的每个令牌最后都有'\0'
。它不仅仅是“包含”它实际上强制写入您的输入字符串。 strtok
返回指向原始输入字符串的指针,它还会通过将'\0'
写入其中来销毁输入字符串。这是一个设计很差的功能,最好避免使用。
答案 3 :(得分:0)
是的,有一个空终止符。它是最后找到的分隔符。这就是strtok的第一个参数不是const char *
的原因:它修改了你给它的缓冲区,这意味着它不能是const。
char buffer[0x20];
char *token;
sprintf(buffer, "Hello, world!");
printf("Address of BUFFER before strtok: %p\n", (void *)buffer);
token = strtok(buffer, ", !");
printf("Address of TOKEN after strtok: %p\n", (void *)token);
printf("Value of BUFFER: %s\n", buffer);
printf("Value of TOKEN: %s\n", token);
运行它,你就会明白传递的第一个字符串是由strtok修改的,以便在第一个字符首先找到空终止符后更改任何分隔符,这意味着如果你使用“,,, Hello ,,, world!” ,它会返回“Hello \ 0 ,, world!”。
在第一次调用strtok之后,您可以通过将NULL作为第一个参数传递给strtok来解析更多的标记。它会自己找到下一个非分隔符号。你可以继续这样做,直到strtok返回NULL,在这种情况下没有更多的匹配。
答案 4 :(得分:-1)
是的,确实如此。来自cplusplus
要确定令牌的开头和结尾,请先执行此功能 从起始位置扫描未包含的第一个字符 在分隔符中(它成为令牌的开头)。然后 扫描从第一个令牌的开头开始 分隔符中包含的字符,它成为令牌的结尾。 如果找到终止空字符,扫描也会停止。
我这样做是为了检查strtok是否附加'\0'
:
#include<stdio.h>
#include<string.h>
int main()
{
char str[]="here !is the! damn code";
setbuf(stdout,NULL);
char s[]="!";
char *token;
token=strtok(str,s);//first call: the function here expects str as argument and first scans from the starting location for the first character not contained in delimiters.
while(token!=NULL)
{
if(*token!='\0')
{
printf("the end of the token is replaced by a null character");// printed for each token which means that the delimiter was replaced by null character,and lastly at the end of the string.
printf("and the token is : %s\n",token);// tokens are printed
}
token=strtok(NULL,s);// the function expects a null pointer(NULL) and uses the position right after the end of last token as the new starting location for scanning in the subsequent calls.
}
return 0;
}
分隔符的数量用来划分标记中的str
,标记的结尾被空字符替换。因此,为每个令牌打印语句,这意味着如果令牌不以空字符结束,则语句只打印一次,即最后一次。