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 塞德直接对斯特托克说——别理我;