strtok()不关于后续调用的新标记值

时间:2015-01-22 08:02:31

标签: c strtok

我在C中使用strtok()遇到了这个相当愚蠢的问题。main中的例程似乎没有参与我更改的令牌,而sub_routine中的例程工作正常我做的唯一不同的事情是将令牌字符保留在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();
}

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

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

static char s = '{';

char symbol = '{';

static char *s = "{";

char *symbol = "{";

并分别用&s&symbol替换strtok()次来电中ssymbol的所有出现次数。

答案 1 :(得分:1)

<强>原型

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

<强> STR

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

<强>分隔符

包含分隔符字符的C字符串。 这些可能因呼叫而异。

更改您的代码如下:

char symbol="{";

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