我在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();
}
有人可以对此有所了解吗?
答案 0 :(得分:2)
strtok
需要字符串作为其第二个参数。在这里,您正在使用指向字符的指针,这是1/2正确的。但是,不 以NULL结尾(它不以(char)0
结尾)。重新定义
static char s = '{';
和
char symbol = '{';
到
static char *s = "{";
和
char *symbol = "{";
并分别用&s
和&symbol
替换strtok()
次来电中s
和symbol
的所有出现次数。
答案 1 :(得分:1)
<强>原型强>
char * strtok ( char * str, const char * delimiters );
<强> STR 强>
要截断的C字符串。 请注意,此字符串通过分解为较小的字符串(标记)进行修改。 或者,可以指定空指针,在这种情况下,函数继续扫描先前成功调用函数的位置。
<强>分隔符强>
包含分隔符字符的C字符串。 这些可能因呼叫而异。
更改您的代码如下:
char symbol="{"
;
它可能在子程序中起作用,因为s变量是静态的并被放入RAM中,其后a放置为0x00。这意味着因为幸运而可以工作......