【问题标题】:Segmentation fault strtok分段错误 strtok
【发布时间】:2014-06-16 06:57:45
【问题描述】:

我试图理解为什么这段代码给我一个分段错误!
research 是一个字符串,它正在打印我的令牌,但之后我遇到了分段错误。
你能帮我吗?

char buf[MAX_CHARS_PER_LINE];
strcpy(buf, research.c_str());

int n = 0;
const char * token[MAX_TOKENS_PER_LINE] = {};

for (n = 0; n < MAX_TOKENS_PER_LINE; n++)
{
    if (n == 0) token[0] = strtok(buf, DELIMITERS);
    else token[n] = strtok(0, DELIMITERS);

    if (!token[++n]) break;

    printf("%s\n", token[n]);
}

【问题讨论】:

  • 如果没有MAX_TOKENS_PER_LINE 令牌怎么办?
  • 除了上面 Blue Moon 的评论之外,您似乎还将 1 添加到 n 两次 - 一次在 for 循环中,一次在断线中。我不知道这是不是有意的?
  • 很难相信这甚至应该打印第一个令牌......

标签: c segmentation-fault strtok


【解决方案1】:

无预增

if (!token[n]) break;

在复制到固定长度的 char 数组时始终使用 strncpy - 而不是 strcpy。

【讨论】:

  • +1,但我建议:“n 已在您的 for 循环中递增”而不是“无预递增”
【解决方案2】:

抱歉,您处理这个问题的方式非常复杂,因此似乎失去了监督。

char buf[MAX_CHARS_PER_LINE] = {0}; /* Intialise the array properly. */
strncpy(buf, research.c_str(), MAX_CHARS_PER_LINE - 1); /* Take care to not overflow the target. */

size_t n = 0; /* size_t is the proper type to index arrays. */
const char * token[MAX_TOKENS_PER_LINE] = {};

token[n] = strtok(buf, DELIMITERS);
while (token[n]  && (n < (MAX_TOKENS_PER_LINE - 1))
{
  n++;

  token[n] = strtok(0, DELIMITERS);

  printf("%s\n", token[n]);
}

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多