【问题标题】:strtok error in C [closed]C中的strtok错误[关闭]
【发布时间】:2014-05-13 19:10:22
【问题描述】:

我有这么一小段代码:

int* index=(int*)(sizeof(int)*NB);
while(i < NB){
    printf("i=%d, pch=%s\n", i, pch);
    if (strcmp(pch, SPLIT_PATTERN))
      i++;
    else
      index[k++]=i-1;
    pch = strtok(NULL, "-");
  }

并使用此输入:

file_content EN7FSQcL63NRUQHSBBRDtVUkobmStQbKdL2cR7gpoC5-X2rS1Cu2RCYaw0TiGdYUUtYuCTB5WlE9Y3SJNuiimQC-ajksldnalmcjlakjflksjoi-
NB = 2
SPLIT_PATTERN = ajksldnalmcjlakjflksjoi (the last part in file_content)

C 给我分段错误错误。

i=0, pch=EN7FSQcL63NRUQHSBBRDtVUkobmStQbKdL2cR7gpoC5
i=1, pch=X2rS1Cu2RCYaw0TiGdYUUtYuCTB5WlE9Y3SJNuiimQC
Segmentation fault (core dumped)

请告诉我我哪里做错了?

【问题讨论】:

  • 呃??? int* index=(int*)(sizeof(int)*NB); 你忘了malloc() 吗?
  • 是的,你说得对。谢谢
  • k的值是多少?
  • 您必须在第一次调用strtok 时提供要拆分的字符串。如果您继续拆分相同的字符串,请在后续调用中传递 NULL 或传递新字符串以开始拆分。
  • 第一次打电话给strtok在哪里?

标签: c segmentation-fault strtok


【解决方案1】:

我怀疑你打算使用:

int* index=(int*)malloc(sizeof(int)*NB);

而不是

int* index=(int*)(sizeof(int)*NB); // malloc is missing.

你应该使用

int* index=malloc(sizeof(int)*NB);

malloc 之前添加额外的int* 不是一个好主意。查看此 SO 帖子中的答案 - Do I cast the result of malloc?

【讨论】:

  • 对不起,我的错。这里是凌晨 3 点 :(
  • 也许应该在一天中的某个时间延迟向 SO 发布问题,或者只是“你确定吗?”
  • 这很好地说明了为什么强制使用 malloc 的 return 是一个坏主意,尽管原因可以为后代详细说明。
【解决方案2】:

此代码可能出现的错误是:

int* index=(int*)malloc(sizeof(int)*NB);
while(i < NB){
    printf("i=%d, pch=%s\n", i, pch);
    if (strcmp(pch, SPLIT_PATTERN))
      i++;
    else
      index[k++]=i-1;
    pch = strtok(NULL, "-");
}

1)k 的值不正确,可能是未初始化,或者超出范围?

2) strtok 仅以NULL 作为参数调用。这是一个如何工作的简单示例:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

给出输出

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

更多信息,请阅读strtok ref

请注意,我们不会强制转换 malloc 返回的内容。 Why?

[编辑]

但是,您的输出表明您在 while 循环之前调用了 strtok

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多