吐出字符串时出现C分段错误

时间:2015-09-08 22:42:35

标签: c segmentation-fault

首先对不起,如果我这是一个基本的(或愚蠢的)问题,我来自Python,我是C的新人(仍在研究它)。

我有一个简短的脚本将字符串拆分成子字符串, 例如:“这是我的-string”变成“this”,“is”,“my”,“ - string”。

之后我想选择以char开头的子串:' - ',并保存在变量中调用“subline”:

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

#define MAX_CHAR 9999

int main ()
{

  char line[] ="this is my -string";
  char *p;
  char subline[MAX_CHAR];


  printf ("Split string in tokens:\n");

  p = strtok (line," ");

  while (p != NULL)
  {
    printf ("%s\n", p);
    p = strtok (NULL, " ,");

    if ((strncmp(p, "-", 1) == 0)){ 
      memcpy(subline, ++p, strlen(p)+1);
      printf ("subline: %s\n", subline);

    }


  }
  printf ("\nData:\n");
  printf ("subline is: %s\n", subline);
  return 0;
}

在while循环中一切都运行良好,我甚至可以打印变量“subline”,但在while循环之外我得到一个分段错误,这里是输出:

root@debian:/home/user/Desktop/splits# ./split
Split string in tokens:
this
is
my
subline: string
string
Segmentation fault

我试图找出并使用malloc(sizeof(* subline))解决它;但在while循环之外始终存在相同的分段错误。

任何人都有任何想法?

谢谢。

2 个答案:

答案 0 :(得分:2)

p变为空时,您仍会将其传递给strcncmp()。不要这样做 - 改为添加另一张支票。

strtok当没有更多匹配时返回NULL,代码在while循环中检测到,但在循环逻辑捕获之前,strncmp()方法被调用NULL指针。

答案 1 :(得分:1)

这是主要错误:

在第一个字符串指针被处理之前,第二次调用函数strtok()

这一行:

memcpy(subline, ++p, strlen(p)+1);

(记住'p'是指向字符串第一个字符的指针,并且由于某些“副作用”,memcpy()函数内该指针的预增量是一个非常糟糕的主意。

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

// wrap numerics in parens to avoid certain 'text replacement' errors
#define MAX_CHAR (9999)

int main ( void )
{

  char line[] ="this is my -string";
  char *p;
  char subline[MAX_CHAR] = {'\0'};  // assure the string will be properly terminated


  printf ("Split string in tokens:\n");

  p = strtok (line," "); // p now points to first token (or contains NULL

  while (p)   // will continue to loop while p not equal to NULL, where NULL is the same as 'false'
  {
      printf ("%s\n", p);

      // don't need all this power function call
      // if ((strncmp(p, "-", 1) == 0))
      if( '-' == p[0] )
      {
          p++; // step past the '-'
          memcpy(subline, p, strlen(p)); // remember, subline is init. to all '\0'
          printf ("subline: %s\n", subline);
      }

      p = strtok (NULL, " ,"); // p now points to next token (or contains NULL)
  } // end while

  printf ("\nData:\n");
  printf ("subline is: %s\n", subline);
  return 0;
}