Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strtok()获取字符串的第一个标记时出现问题_C_Strtok - Fatal编程技术网

C strtok()获取字符串的第一个标记时出现问题

C strtok()获取字符串的第一个标记时出现问题,c,strtok,C,Strtok,以下代码无法获取字符串的第一个标记: char *p1; char array[100]; strcpy(array, "ANY STRING WOULD DO"); p1 = strtok(array, " "); p1 = strtok(NULL, " "); p1 = strtok(array, " "); p1 = strtok(NULL, " "); printf("%c", p1); 请看这里给出的示例:请看这里给出的示例:strtok实际上用文本“\0”替换分隔符,实际上是在原

以下代码无法获取字符串的第一个标记:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");

printf("%c", p1);

请看这里给出的示例:

请看这里给出的示例:

strtok实际上用文本“\0”替换分隔符,实际上是在原始字符串上写入。你第二次打电话给斯特卡瑞;,数组现在看起来像

任何'\0'字符串'\0'都可以

e、 如果你要打印字符串,你只会看到任何

因为strtok不超过字符串的结尾,所以第二次只能得到一个令牌,并且调用strtokNULL;返回NULL。要解决此问题,您需要将字符串复制到另一个位置以进行第二组操作,或者保存一个临时字符串指针。

strtok实际上将分隔符替换为文字“\0”-实际上是在原始字符串上写入。你第二次打电话给斯特卡瑞;,数组现在看起来像

任何'\0'字符串'\0'都可以

e、 如果你要打印字符串,你只会看到任何

因为strtok不超过字符串的结尾,所以第二次只能得到一个令牌,并且调用strtokNULL;返回NULL。要解决此问题,您需要将字符串复制到另一个位置以进行第二组操作,或者保存一个临时字符串指针。

这样可以:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");

printf("%s", p1);
strtok修改传递的字符串,因此如果要重新解析它,需要再次复制它

如果您只想保留令牌,只需复制指针即可。

这将起作用:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");

printf("%s", p1);
strtok修改传递的字符串,因此如果要重新解析它,需要再次复制它

如果您只想保留标记,只需复制指针。

请记住,strtok通过在每个标记后面放置“\0”字符来修改字符串

因此,当您再次尝试标记相同的字符串时,实际上只标记了第一个标记

这将导致第二个p1=strtokNULL;将返回NULL,然后当您尝试打印p1时,它将尝试取消对NULL的引用,可能会失败

请注意,您需要使用%s而不是%c,因为您打印的是字符串,而不是字符。

请记住,strtok通过在每个标记后放置“\0”字符来修改字符串

因此,当您再次尝试标记相同的字符串时,实际上只标记了第一个标记

这将导致第二个p1=strtokNULL;将返回NULL,然后当您尝试打印p1时,它将尝试取消对NULL的引用,可能会失败

请注意,您需要使用%s而不是%c,因为您打印的是一个字符串,而不是一个字符。

strtok在找到令牌的结尾时,通过向字符串中添加零终止符“\0”来修改正在查找令牌的字符串。所以在遍历它之后,它不再是内存中的连续字符串。这就是为什么不能在开始时重新开始并重新解析字符串中的令牌

您可能有两种选择:

首先复制一个字符串,并将其标记化

char *p1; char array[100]; strcpy(array, "ANY STRING WOULD DO");

char tmp[100];
strcpy( tmp, array );
p1 = strtok(tmp, " ");
p1 = strtok(NULL, " ");

strcpy( tmp, array );
p1 = strtok(tmp, " ");
p1 = strtok(NULL, " ");

printf("%c", p1);
或者,您可以在找到单独的令牌时保留一个指向它们的指针数组,并重新使用该数组,而不是重新调用strtok

strtok在找到令牌的结尾时,通过向字符串中添加零终止符“\0”来修改正在查找令牌的字符串。所以在遍历它之后,它不再是内存中的连续字符串。这就是为什么不能在开始时重新开始并重新解析字符串中的令牌

您可能有两种选择:

首先复制一个字符串,并将其标记化

char *p1; char array[100]; strcpy(array, "ANY STRING WOULD DO");

char tmp[100];
strcpy( tmp, array );
p1 = strtok(tmp, " ");
p1 = strtok(NULL, " ");

strcpy( tmp, array );
p1 = strtok(tmp, " ");
p1 = strtok(NULL, " ");

printf("%c", p1);
或者,您可以在找到单独的令牌时保留一个指向它们的指针数组,并重新使用该数组,而不是重新调用strtok


下次请使用代码格式。这次我为你做了。程序运行但自动终止,但如果我删除第二个p1=strtokNULL;它运行得很好。很抱歉我忘记用了。下次请用代码格式。这次我为你做了。程序运行但自动终止,但如果我删除第二个p1=strtokNULL;它运行得很好。很抱歉我忘了用,它不会用的。因为您正在向strtok传递一个字符串文本,它将想要修改它。不。。。我正在传递一个副本,就像原始代码一样,文本是分隔符字符串,strtok不会改变它。呵呵。。。我的眼睛欺骗了我,呵呵。。。出于某种原因,我认为任何字符串都可以直接传递给strtok,忽略我;不会的。因为您正在向strtok传递一个字符串文本,它将想要修改它。不。。。我正在传递一个副本,就像原始代码一样,文本是分隔符字符串,strtok不会改变它。呵呵。。。我的眼睛欺骗了我,呵呵。。。出于某种原因,我认为任何字符串都可以执行字符串文字是pas 塞德直接对斯特托克说——别理我;