strtok导致分段错误

时间:2018-12-23 09:34:52

标签: c string 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);
}

1 个答案:

答案 0 :(得分:1)

  

现在,第一个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; 
}
相关问题