strtok 导致分段错误

strtok is causing a Segmentation Fault

我必须得到字符串中的第三个单词,想使用 strtok。现在,第一个 printf 有效,但之后我遇到了段错误。所以 tokenizedString = strtok(NULL, " "); 一定是导致问题的原因,对吧?

仅供参考:我正在寻找字符串中的第三个单词,单词之间可以有尽可能多的空格。

#include <string.h>
#include <stdio.h>

char *tokenizeString(char *userCommand)
{
  char *tokenizedString;
  int counterForToken;
  tokenizedString = strtok(userCommand, " ");
  for(counterForToken = 0; counterForToken != 3; counterForToken++)
  {
    printf("%s\n", tokenizedString);
    tokenizedString = strtok(NULL, " ");
    if(tokenizedString == NULL)
    {
        break;
    }
  }
  printf("%s\n", tokenizedString);
  return tokenizedString; 
}

int main(void)
{
  char userCommand[255] = {0};
  fgets(userCommand, sizeof(userCommand), stdin);
  tokenizeString(userCommand);
}

Now, the first printf works but after that I get a Seg Fault. So tokenizedString = strtok(NULL, " "); must be causing the issue, right?

不,那是很差的相关性。事实上,问题出在对 printf 的第二次调用中。你可以在 tokenizedString == NULL 时传递它 tokenizedString。指定的格式 %s 被指定为期望 有效指针 指向零终止字符数组的第一个字符。传递 NULL 是非法的,会导致未定义的行为(例如导致崩溃)。解决方法很简单:检查空指针值。这同样适用于循环的第一次迭代,当然

char *tokenizeString(char *userCommand)
{
  char *tokenizedString;
  int counterForToken;
  tokenizedString = strtok(userCommand, " ");
  for(counterForToken = 0; counterForToken != 3 && tokenizedString != NULL; counterForToken++)
  {
    printf("%s\n", tokenizedString);
    tokenizedString = strtok(NULL, " ");
  }
  if(tokenizedString != NULL)
    printf("%s\n", tokenizedString);
  return tokenizedString; 
}