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
分别替换为 s
和 symbol
。
我在 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
分别替换为 s
和 symbol
。