2013-10-12 69 views
0

我正在编写用于删除相似字符的算法代码。 例如如果输入字符串是“abb”,则输出应该是“a”,而对于“abcddbf”输出的字符串应该是“acf”。分段故障点

我已经写了一些代码,如下所述,但一些如何得到Segmentation Faut并且我无法找到错误点。

代码:

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

char *remove_adjecent_string(char *in,int count) 
{ 
int i=0; 
int j=0; 
int flag = 0; 
int total = strlen(in); 
static char *output = NULL; 

if(count == 0) 
{ 
    output=(char *)malloc(sizeof(char)*total); 
    if(output == NULL) 
    { 
      return NULL; 
    } 
    for(i=0,j=0;i<=total;i++) 
    { 
      if(in[i] != '*') 
      { 
        output[j]=in[i]; 
        j++; 
      } 
    } 
    return (char *)output; 
} 

for(i=0;i<=count;++i) 
{ 
    printf("In loop i :%d count :%d \t",i,count); 
    printf("Before comparition in[i] = %c , in[count] = %c \t",in[i],in[count]); 
    if(in[i] == in[count]) 
    { 
      printf("Same found in[%d] = in[%d] = %c",i,count,in[i]); 
      in[i]='*'; 
      flag = 1; 
    } 
    printf(" Next loop i = %d\n",++i); 
} 

printf("Before Recursion \n"); 
output =remove_adjecent_string(in,(count-1)); 
return (char *)output; 
} 


int main() 
{ 
    char *input; 
    char *output; 
    int i=0; 
    input = (char *)malloc(sizeof(char)*10); 
    if(input == NULL) 
    { 
      return; 
    } 
    output=(char *)malloc(sizeof(char)*10); 
    if(output == NULL) 
    { 
      return; 
    } 
    input = "abbb"; 
    int count = -1; 
    count=strlen(input); 
    output=remove_adjecent_string(input,(count-1)); 
    printf("Input String = %s\n",input); 
    printf("Output String = %s\n",output); 

} 

帮助我找出发生故障的情况下。

+2

如果无法使用调试器,把printf语句在每个非重要代码块之后。无论在段错误之前打印什么都可以。您可以根据需要继续添加printf语句,直到您可以识别导致段错误的行。 – siride

+0

使用gdb,看看哪一行给出了分段错误,你可能会得到为什么发生这种情况。 – Rohan

+0

始终分配用过的长度+1(用于\ 0) – Gar

回答

0

如何找到段错误:

  1. 调试符号添加到您的可执行文件。如果您使用g ++或gcc,请将-g选项添加到编译器命令行。
  2. 在调试器中运行程序:gdb --args ./your-program [args] gdb和linux。
  3. 类型r运行程序。
  4. 等待分段错误以调整
  5. 键入bt以打印调用堆栈。找到代码中最上面的一行,并获取文件名和行号。
  6. 仔细看看那条线。
+0

Thank you..urzeit。:) –

0

东西我发现的是,remove_adjecent_string()返回一个缓冲区包含字符串(命名为output),但malloc ING和填充该缓冲区间,在没有一刻它确保了正确的null-terminated string\0最后一个字符之后)。实际上,你甚至没有为此分配足够的空间。

根据具体情况的不同,这可能会导致您的printf()打印内存垃圾,甚至导致分段错误,因为它会继续打印缓冲区之后的内存中的任何内容,直到最终找到丢失的空字节为止。

4
input = "abbb"; 

因此输入指向一个不可修改的常量字符串。

in[i]='*'; 

加:当您尝试写它,它会SEGV你似乎要复制“AB | BB”来输入,所以考虑用strncpy()

+0

Thank you..tristan :) –