在 C 中,即使从不同来源编译示例代码,strtok 也会导致我的程序崩溃
In C, strtok causing my program to crash even when compiling example code from different sources
使用下面演示的代码,程序崩溃了。这是我从this source复制粘贴的代码,根本没有修改它,但是strtok似乎导致程序崩溃。
#include <string.h>
#include <stdio.h>
int main()
{
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
我似乎找不到原因。我尝试寻找 strtok 函数的来源,并遇到了 this:
char * __cdecl strtok(char *s1, const char *delimit)
{
static char *lastToken = NULL; /* UNSAFE SHARED STATE! */
char *tmp;
/* Skip leading delimiters if new string. */
if ( s1 == NULL ) {
s1 = lastToken;
if (s1 == NULL) /* End of story? */
return NULL;
} else {
s1 += strspn(s1, delimit);
}
/* Find end of segment */
tmp = strpbrk(s1, delimit);
if (tmp) {
/* Found another delimiter, split string and save state. */
*tmp = '[=11=]'; //->This seems to be the line at fault<-
lastToken = tmp + 1;
} else {
/* Last segment, remember that. */
lastToken = NULL;
}
return s1;
}
制作本地副本并在我的代码中使用它会导致同样的问题,并且在使用一些打印后似乎在第一次调用该函数后,它崩溃了,特别是 strpbrk return s 是可以访问的正确值(通过对其 return 值使用 printf),但是当分配值 \0 时,它会导致程序崩溃(显然无法打印在它之后输入的任何消息) .
就我所知,有人知道发生了什么事吗?
提前感谢您的回复。
请看code is working。问题可能是您的本地环境和配置中的本地错误。您可以尝试使用另一台计算机或按照 link 进行操作,看看您是否获得了预期的输出。
#include <string.h>
#include <stdio.h>
int main()
{
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
如果您 运行 使用分析程序编译的程序,例如 Valgrind 您会注意到代码中没有报告任何错误,或者您可以在其中调试崩溃并得到一个错误很好的错误消息,在程序崩溃的代码中。
使用下面演示的代码,程序崩溃了。这是我从this source复制粘贴的代码,根本没有修改它,但是strtok似乎导致程序崩溃。
#include <string.h>
#include <stdio.h>
int main()
{
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
我似乎找不到原因。我尝试寻找 strtok 函数的来源,并遇到了 this:
char * __cdecl strtok(char *s1, const char *delimit)
{
static char *lastToken = NULL; /* UNSAFE SHARED STATE! */
char *tmp;
/* Skip leading delimiters if new string. */
if ( s1 == NULL ) {
s1 = lastToken;
if (s1 == NULL) /* End of story? */
return NULL;
} else {
s1 += strspn(s1, delimit);
}
/* Find end of segment */
tmp = strpbrk(s1, delimit);
if (tmp) {
/* Found another delimiter, split string and save state. */
*tmp = '[=11=]'; //->This seems to be the line at fault<-
lastToken = tmp + 1;
} else {
/* Last segment, remember that. */
lastToken = NULL;
}
return s1;
}
制作本地副本并在我的代码中使用它会导致同样的问题,并且在使用一些打印后似乎在第一次调用该函数后,它崩溃了,特别是 strpbrk return s 是可以访问的正确值(通过对其 return 值使用 printf),但是当分配值 \0 时,它会导致程序崩溃(显然无法打印在它之后输入的任何消息) .
就我所知,有人知道发生了什么事吗?
提前感谢您的回复。
请看code is working。问题可能是您的本地环境和配置中的本地错误。您可以尝试使用另一台计算机或按照 link 进行操作,看看您是否获得了预期的输出。
#include <string.h>
#include <stdio.h>
int main()
{
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
如果您 运行 使用分析程序编译的程序,例如 Valgrind 您会注意到代码中没有报告任何错误,或者您可以在其中调试崩溃并得到一个错误很好的错误消息,在程序崩溃的代码中。