我正在编写用于删除相似字符的算法代码。 对于Ex。如果输入字符串是“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);
}
帮助我找出有问题的案例。
答案 0 :(得分:4)
input = "abbb";
所以输入指向一个不可修改的const字符串。当你试图写信时它会被segv:
in[i]='*';
添加:您似乎想要将“abbb”复制到输入中,所以请考虑使用strncpy()
答案 1 :(得分:0)
如何查找段错误:
-g
- 选项添加到编译器命令行。gdb --args ./your-program [args]
用于gdb和linux。r
以运行该程序。bt
以打印调用堆栈。找到代码中最顶行的行,并获取文件名和行号。答案 2 :(得分:0)
我检测到的是remove_adjecent_string()
返回一个包含字符串的缓冲区(名为output
),但在malloc
和填充此缓冲区之间,它决不会确保它是正确的null-terminated string(最后一个字符后的\0
)。事实上,你甚至没有为此分配空间。
根据具体情况,这可能会导致printf()
打印内存垃圾,甚至导致分段错误,因为它会在缓冲区后继续打印内存中的内容,直到最终在某处找到空字节丢失。