这是一种消除相同字符序列并将其替换为一个字符的算法,但是无效。请帮忙吗?

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

10-04 10:12