c语言 for 的用法

编程,从键盘输入一字符串,把该字符串中重复的字符保留最前一个,删去以后其余的,即某个字符出现n个,则删去后n-1个,最后输出处理后的该字符串。例如,
输入:1a2a1b1c2b3a#2b3b%2c1d2d3c*3d&#
输出:1a2bc3#%d*&

#include "stdio.h"
main()
{ char s[81],t[81]={0};
int i,j,k;
gets(s);
for(k=i=0;s[i];i++)
{ for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
if(j<0) t[k++]=s[i];
}
puts(t);
}
从那个for 开始不懂了 j=i-1;这个是初始值,那i是从0开始做的,j不就是从-1开始做了??还有后面的那个k 是干嘛的没看懂,求解释,或者给个更好理解的程序~~

for(k=i=0;s[i];i++)
{ for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
if(j<0) t[k++]=s[i];
}
第一次 i=0
s[i]是外层判断条件,只要s没结束就不是\n,就符合条件循环下去。
j=-1,但不满足j>=0条件,
所以不执行if(s[i]==s[j]) break;
执行if(j<0) t[k++]=s[i];其实质是t[0]=s[0],k++;就是将s第一个字符赋给了t第一个字符。

.
.
.

i=N 时
j=N-1,满足j>=0,执行if(s[i]==s[j]) break;这句是在判断当前s第N+1个字符s[i]是否与s之前的字符相同,

如果相同就直接跳出for循环,如果不同j--,执行if(s[i]==s[j]) break;判断 s[i]==s[j] 继续向前查找是否有与s[i]相同的字符。一旦找到也跳出。

这里就有两种情况:

第一种,该字符在之前已出现过,那么在
for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
中通过遍历,总是能找到与之相同的字符也就跳出了,此时j值定满足j>=0,那么跳出后,由于j>=0,if(j<0) t[k++]=s[i];这句就无效了,意思就是,重复的字符不会记录在t中了。

第二种,该字符s[i]没有在之前出现过,那么在
for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;

中通过遍历,肯定找不到,这个循环会从j=N-1开始通过j--循环到j=-1,不满足j>=0条件而退出此for循环。

此后执行if(j<0) t[k++]=s[i];此时j=-1,满足条件,t[k++]=s[i];就是将该新出现的字符s[i]赋给t[k],同时k++,准备接受下一个从未出现的字符。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-05
#include "stdio.h"
main()
{
char s[81];
int hash[256]={0};
int i,j,k;
gets(s);
for(i=0;s[i];++i)
{
if(!hash[int(s[i])])
{
hash[int(s[i])]=1;
putchar(s[i]);
}
}
printf("\n");
}
第2个回答  2010-11-05
for(k=i=0;s[i];i++)表示k和i初始值为0的时候开始循环,循环内部代码执行完的时候i的值加1
for(j=i-1;j>=0;j--)你说的没错,所以i=0的时候这个循环执行0次,那为什么不直接从i=1开始呢?是为了给k赋初始值0,这样的代码很简洁。
t[k++]=s[i];在给t[]数组赋值的时候也在让k加1,这样就可以给每个t[]数组的成员赋值了,至于能赋值多少得看你那上边的break什么时候执行了,懂了吗?
相似回答