0

我正在编写删除相似字符的算法代码。对于前。如果输入字符串是“abb”,输出应该是“a”,对于“abcddbf”,字符串输出应该是“acf”。

我已经编写了一些如下所述的代码,但是一些我如何获得分段错误并且我无法找到故障点。

代码 :

#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);

}

帮我找出故障案例。

4

3 回答 3

4
    input = "abbb";

所以 input 指向一个不可修改的 const 字符串。当您尝试写入时,它将 segv:

    in[i]='*';

添加:您似乎想将“abbb”复制到输入,因此请考虑使用 strncpy()

于 2013-10-12T06:18:41.770 回答
0

如何查找段错误:

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

我检测到返回一个包含字符串remove_adjecent_string()的缓冲区(名为),但在ing 和填充此缓冲区之间,它在任何时候都不能确保它是一个正确的以null 结尾的字符串(在最后一个字符之后)。事实上,你甚至没有为此分配足够的空间。outputmalloc\0

根据情况,这可能会导致您printf()打印内存垃圾,甚至导致分段错误,因为它会继续打印缓冲区之后内存中的任何内容,直到它最终发现某个地方丢失了一个空字节。

于 2013-10-12T06:10:55.543 回答