【问题标题】:strtok is causing a Segmentation Faultstrtok 导致分段错误
【发布时间】:2018-12-23 09:34:52
【问题描述】:

我必须得到字符串中的第三个单词并想使用 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);
}

【问题讨论】:

  • 在致电tokenizeString 之前怀疑您的问题出在userCommand
  • 我用tokenizeString(userCommand);调用我的函数
  • userCommand 传递了什么?
  • @StoryTeller 我得到UserCommand 就像这样:char userCommand[255]; fgets(userCommand, sizeof(userCommand), stdin);
  • @MaximilianWolf 正如 StoryTeller 所说,请发帖 minimal reproducible example

标签: c string strtok


【解决方案1】:

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

不,这是非常差的相关性。问题实际上在于对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; 
}

【讨论】:

  • 天哪,我是个白痴。感谢您帮助提出问题并提供答案。您可能会说,我几乎没有编程经验。
  • @MaximilianWolf - NP。没有人与生俱来。提出这样的问题很难。这就是为什么有经验的用户应该努力帮助新用户。坚持下去,不要让这些问题让你灰心丧气。有了经验,这会变得更容易。
  • 第三个词也是 OP 想要的。那是标记号 2,而不是 3。现在第二个 printf 输出第四个单词。
  • @JanneTuukkanen - 是的。但我考虑修复实现逻辑中的错误,而不是修复标准库的滥用。现在 OP 的代码没有崩溃,他们可以继续他们的旅程并完成他们的程序。
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多