是函数strtok的返回值中包含的空字符?

时间:2013-07-05 03:15:22

标签: c string

对于strtok返回的字符串,最后是否有\0? 或者它不像strncpy函数那样?

我会通过将strtok的返回值复制到另一个带strcpy的字符串数组来检查,但后来我不知道附加的\0是否是{{1}的效果或strtok(因为strcpy确实添加了strcpy)。

编辑:抱歉,我无法“将\0的返回值复制到另一个strtok字符串数组”。

5 个答案:

答案 0 :(得分:10)

来自cplusplus.com

  

令牌的这一端自动被空字符替换,   并且函数返回令牌的开头。

答案 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 ,标记的结尾被空字符替换。因此,为每个令牌打印语句,这意味着如果令牌不以空字符结束,则语句只打印一次,即最后一次。