在 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 您会注意到代码中没有报告任何错误,或者您可以在其中调试崩溃并得到一个错误很好的错误消息,在程序崩溃的代码中。