首页 > 解决方案 > strtok 导致分段错误

问题描述

我必须得到字符串中的第三个单词并想使用strtok。现在,第一个printf工作,但之后我得到一个 Seg Fault。所以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);
}

标签: cstringstrtok

解决方案


现在,第一个 printf 工作,但之后我得到一个 Seg Fault。所以tokenizedString = strtok(NULL, " ");一定是导致问题的原因,对吧?

不,这是非常差的相关性。问题实际上在于第二次调用printf. tokenizedString时可以通过tokenizedString == NULL。指定的格式%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; 
}

推荐阅读