这是一种消除相同字符序列并将其替换为一个字符的算法,但是无效。请帮忙吗?
#include<stdio.h>
#include<string.h>
int main ()
{
char ch[100],ch1[100]="",ch2[100];
int i;
gets(ch);
i=0;
while(i<strlen(ch)-1)
{
if(ch[i]==ch[i+1])
{
strncpy(ch1,ch,i);
strcat(ch1,ch+i+1);
sprintf(ch,"%s",ch1);
}
else
i++;
}
puts(ch);
return 1;
}
最佳答案
主要问题在这里:
strncpy(ch1,ch,i);
如果
strncpy
函数在i
的前ch
个字符中找不到一个终止符,则不会添加NULL终止符。由于ch1
已初始化,因此通过循环执行的第一次很好,但是随后的迭代包含它最后一次拥有的内容。因此,当您进入strcat
时,它会附加到以前的位置。调用
strncpy
之后,您需要自己添加NULL终止符:strncpy(ch1,ch,i);
ch1[i] = '\0';
另外,切勿使用
gets
。它没有进行适当的边界检查。而是使用fgets
:fgets(ch, sizeof(ch), stdin);