C语言 删除重复字符这个程序为什么有j--

#include <stdio.h>
#include <string.h>
int main()
{
int i,j,k,t;char a[200];
gets(a);
for(i=0;i<strlen(a);i++)
{
for(j=i+1;j<strlen(a);j++)
{
if(a[i]==a[j])
{
for(k=j;k<strlen(a);k++)
{
a[k]=a[k+1];

}j--;
}
}
}
puts(a);
}

#include <stdio.h>
#include <string.h>
int main()
{
int i,j,k,t;char a[200];

gets(a);//接收一个字符串,比如是:hello
for(i=0;i<strlen(a);i++)//遍历字符串,从第1个字符开始
{
for(j=i+1;j<strlen(a);j++)//遍历字符串,从第2个字符开始
{
if(a[i]==a[j])//前后字符相等,比如hello的ll相等了
{
for(k=j;k<strlen(a);k++)//遍历相等的字符之后的字符
{
a[k]=a[k+1];//从相等的字符,开始往前赋值,这里就是hello-->helo
}
j--;//这个就是怕连续三个字符相等,因此要回退一个,例如,hello,经过上面的步骤变成hello,还有两个相等的,如果没有j--,helllo最终输出的是hello,而不是helo
}
}
}
puts(a);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-01-11
因为刚刚删除了一个字符,把后面的全移上来了,那么刚才那个位置上的字符就得重新检测。不然,若有连续3个相同字符的话就只删除了一个!比如12334567,结果是1234567,而123334567,则结果是12334567……
第2个回答  2019-01-11
for (i = 0; i<strlen(a); i++)
{
for (j = i + 1; j<strlen(a); j++/* 每次循环之后执行j++ */)
{
if (a[i] == a[j])
{
for (k = j; k<strlen(a); k++)
{
a[k] = a[k + 1];//这个循环是把后面的字符串前移
}
/*
j--的功能是
比如有字符串 aaab 当前的 j=1 字符串前移之后 是 aab
 如果没有j--的话 执行上面的j++ 就会跳过第二个a了
*/
j--;
}
}
}


//给你写一个不用j--的代码
for (i = 0; i<strlen(a); i++)
{
for (j = i + 1; j<strlen(a);)
{
if (a[i] == a[j])
{
for (k = j; k<strlen(a); k++)
{
a[k] = a[k + 1];//这个循环是把后面的字符串前移
}
}
else
{
j++;
}
}
}

本回答被提问者采纳

C语言 删除重复字符这个程序为什么有j--
j--;\/\/这个就是怕连续三个字符相等,因此要回退一个,例如,hello,经过上面的步骤变成hello,还有两个相等的,如果没有j--,helllo最终输出的是hello,而不是helo } } } puts(a);}

怎样用c语言编写删除重复字符的程序
程序的基本思路是把输入的字符串放到a[100]字符组中,然后把a[100]中所有不重复的字符添加到b[100]中,间接完成对字符串中的重复字符的删除 include void main(){ char a[100],b[100];\/\/定义两个字符组,a[100]用来接收输入的字符串,b[100]用来存储不重复的字符 int pa=0,pb=0,i,flag;...

c语言排序后删除数组中重复的数字再排序输出
} \/\/删除重复字符 voiddelete_repeat(char*str){ \/**判断数组内第i个字符是否与前i-1个字符存在重复:若重复,删除该字符,i之后的字符下标均减1,后重新判断新的第i个字符 若不重复,不做处理,继续遍历下一个 \/ for(inti=1;str[i]!='\\0';i++){ for(intj=0;j<i;j++){ if(str[...

C语言中删除字符串中的重复字符,然后输出新的字符串
include <stdio.h>#include <string.h>int main(){ char c,str[80]; int i=0,j,k,len; printf("input:"); gets(str); len=strlen(str); c=str[i]; while(c!='\\0') { for(j=i+1;str[j]!='\\0';j++) { if(str[j]==c) { for...

c语言 输入一个长度不超过 100 的字符串,删除串中的重复字符.
include <stdio.h>int main () { char s[101]; int i,j,k; gets(s); for(i=0;s[i];i++) { for(j=k=i+1;s[j];j++) if(s[j]!=s[i]) s[k++]=s[j]; s[k]='\\0'; }

C语言程序题:从键盘输入8 个数字,删除重复的字符输出
int main(){ int a[8],b[8],i,j,k=0,flag;printf("输入八个数\\n");scanf("%d%d%d",&b[0],&b[1],&b[2],&b[3],&b[4],&b[5],&b[6],&b[7]);for(i=0;i<=7;i++){ flag=1;for(j=0;j<=i-1;j++)if(a[j]==b[i]){ flag=0;break;} if(flag){ a[...

c语言中AScii码值有等于330的吗??为什么输出显示是字符J ??_百度知 ...
比如把0xABCD赋值给ch,ch只取0xCD作为ch的值,330 = 0x014A,截断成一个字节的char就是 0x4A = 74,也就是大写的J。在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言...

简单C语言问题
这个在C里面是合法的,算Warning,但在C++中是错误。用gcc可以编译过去:[root@ ~]# cc -o 2 -Wall 2.c 2.c:6: 警告:‘main’的返回类型不是‘int’2.c: 在函数‘sort’中:2.c:23: 警告:传递‘strcmp’的第 1 个参数时将整数赋给指针,未作类型转换 \/usr\/include\/string.h:143:...

s=10*s+p[i][j]-'0'是什么意思
这个程序是通过循环,将字符数组第二维下标是偶数的字符选出,转换为整数并输出。 依次找出是字符是6、3、8、5,而语句s=10*s+p[i][j]-'0';就是转换为整数。 s=0;\/\/即s的初始值是0 for(j=0;p[i][j]>'\\0';j+=2)\/\/依次找出数组第二维下标是偶数的字符 s=10*s+p[i][j]-'0';\/\/转换...

...中连续出席的重复字母进行压缩,并输出压缩后的字符串。
请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。压缩规则:1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。要求实现函数: ...

相似回答