strtok() 不考虑后续调用的新令牌值

strtok() not regarding the new token value on subsequent calls

我在 C 语言中使用 strtok() 遇到过这个相当愚蠢的问题。main 中的例程似乎没有处理我更改的标记,而在 [=12= 中同样有效] 我所做的唯一不同的事情是将令牌字符保留在 static 中。

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

void sub_routine()
{
  char str[80] = "This is { some important } website";
  char *val = NULL;
  val = (char *)malloc(sizeof(char)*255);
  strncpy(val, str, sizeof(str));
  static char s = '{';
  char *token;

  /* get the first token */
  token = strtok(val, &s);

  /* walk through other tokens */
  while( token != NULL ) 
  {
    printf( " %s\n", token );
    s= '}';
    token = strtok(NULL, &s);
  }
}

int main()
{
  char symbol='{';
  char *string = NULL;
  char *match = NULL;
  char ref[255]="Do something here {Do it now}. What now?";

  string = (char *)malloc(sizeof(char) * 255);
  strncpy(string, ref, sizeof(ref));

  match = strtok(string, &symbol);
  printf("\n%s", match);
  printf("\n%s", string);
  if(string!= NULL)
  {
    symbol = '}';
    match= strtok(NULL, &symbol);
    printf("\n%s\n", match);
  }
  sub_routine();
}

有人可以解释一下吗?

原型

char * strtok ( char * str, const char * delimiters );

str

C 要截断的字符串。 请注意,此字符串已通过分解为更小的字符串(标记)进行了修改。 或者,可以指定一个空指针,在这种情况下,该函数将继续扫描先前对该函数的成功调用结束的位置。

定界符

C 包含分隔符的字符串。 这些可能与一次调用不同。

更改您的代码如下:

char symbol="{";

它可能在子程序中工作,因为 s 变量是静态的并且被放入 RAM 中,在它之后的 a 中放置一个 0x00。这意味着可以工作因为幸运...

strtok 需要一个 string 作为它的第二个参数。在这里,您使用的是指向字符的指针,这是 1/2 正确的。但是,它 不是 NULL 终止的 (它不以 (char)0 结尾)。重新定义

static char s = '{';

char symbol = '{';

static char *s = "{";

char *symbol = "{";

并将 strtok() 调用中出现的所有 &s&symbol 分别替换为 ssymbol