0

我需要帮助将字符串分解为数组。我让它在不存储信息的情况下工作,只打印令牌。但是对于这个 prog,我需要存储 strtok 制作的标记并使用二进制搜索来执行 strncmp,其中有 2 个元素,每个元素来自不同的数组。

./file "示例输入:因为我是蝙蝠侠"

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char delims[] = " ";
  char *result = NULL;

  int i = 1;
  int j = 0;

  char sent[1000];
  result = strtok(argv[1], delims);
  sent[0] = *result;
  while(result != NULL)
  {
    result = strtok(NULL, delims);
    sent[i] = *result;
    i++;
  }

  while(j < i)
  {
    printf(" %p\n", &sent[j]);
    j++; //Forgot to add it in first time around
  }
return 0;
}

问题是我遇到了分段错误,我似乎无法将令牌存储到数组中,我不明白为什么。是指针问题吗?传递不兼容的数据类型?还有什么?

编辑:想要的输出:“示例”“输入:”“'Cause”“I'm”“Batman”

任何帮助都会很棒。

4

3 回答 3

1

在您的情况下,很容易找出导致崩溃的原因:您取消引用NULL指针。

想一想表达式*resultwhen resultis会发生什么NULL


此外,如果您使用调试器,这个错误将花费您不到一分钟的时间来查找。当程序崩溃时,程序员的第一直觉应该始终是在调试器中运行程序。

于 2013-05-27T07:15:26.307 回答
0

当 strtok 到达字符串中的 '\0' NUL 字符时,它将返回 NULL 指针。

在进行 strtok(NULL, delims) 调用后,您的代码中的“结果”将被取消引用。因此,您将在不对其有效性进行完整性检查的情况下取消引用结果,并最终访问 NULL 指针。

于 2013-05-27T08:11:01.313 回答
0

像这样修复

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
    char delims[] = " ";
    char *result = NULL;
    int i = 0, j;
    char sent[1000];
    char *parray[32];//32 word

    strcpy(sent, argv[1]);//strtok destory string, argv[n] is read only.
    result = strtok(sent, delims);
    parray[i++] = result;
    while(NULL!= (result=strtok(NULL, delims))){
        parray[i++] = result;
    }

    for(j=0; j < i;++j)
        printf("%s\n", parray[j]);
    return 0;
}
于 2013-05-27T08:39:16.520 回答