问题描述
- 代码求解,拜托了,大神抱大腿
-
include
define N 100
void squeeze(char s1[],char s2[]);
int main()
{
char s1[];
char s2[];
printf("请输入两个字符串n");
gets(s1);
gets(s2);
squeeze(s1,s2);
printf("%s",s1);
return 0;
}
void squeeze(char s1[],char s2[])
{
int i,j,k;
k=0;
for(i=0;s1[i]!='';i++)
for(j=0;s2[j]!='';j++)
{
if (s1[i]!=s2[j])
s1[k]=s1[i];
k++;
}
}
请大神解答一下这串代码错哪了,这串代码是为了实现将s1,s2两个字符串中相同的元素去掉后输出s1
解决方案
您的【k++】放的位置不对,应该将它放在它下面那个【 } 】下面
解决方案二:
哦,也不对,应该把它放在那个【i++,】的后面也可以,即第一个for循环里面。
解决方案三:
楼主,你两个FOR循环出了问题。你的FOR循环是,只要发现s1中的一个字符与s2中的任意一个字符不同,就会保存到s1中。
我帮你改过来了。如果没看懂,请留言。
#include <stdio.h>
#include <string.h>
#define N 100
void squeeze(char s1[],char s2[]);
int main()
{
char s1[N];
char s2[N];
printf("请输入两个字符串n");
gets(s1);
gets(s2);
squeeze(s1,s2);
printf("%sn",s1);
return 0;
}
void squeeze(char s1[],char s2[])
{
int i,j,k;
k=0;
for(i=0;s1[i]!='';i++)
{
for(j=0;s2[j]!='';j++)
{
if (s1[i]==s2[j])
break;
}
if(s2[j]=='')
s1[k++]=s1[i];
}
s1[k]='';
}
解决方案四:
首先,数组s1和s2连数组大小都没有....
然后,squeeze函数写错了。我看你的代码,大概思路是对s1的每个元素都判断一遍s2中是否存在相同元素,如果不存在,就保留这个元素。
但是!但是,你应该等到s2数组遍历完了以后才能判断有没有相同元素啊,你这里一旦s1【i】!=s2【j】,立马就判断是不存在相同元素了。
附上我改过之后的squeeze的函数:
void squeeze(char s1[],char s2[])
{
for(int i=0;s1[i]!='';i++)
{
int flag=0;
for(int j=0;s2[j]!='';j++)
if (s1[i]==s2[j])
flag=1;
if(flag)
{
int k=i;
while(s1[k]!='')
{
s1[k]=s1[k+1];
k++;
}
}
}
}
解决方案五:
k一直指着中间结果s1的最后一个元素
for(i=0; s1[i]!=''; i++){
for(j=0; s2[j]!=''; j++)
{
if(s1[i] == s2[j]){
break;
}
}
//s1[i]不在s2中
if(s2[j] == 'n'){
s1[k] = s1[i];
k++;
}
}
s1[k] = ''
s1 : [1,2,3,4]
s2 : [0,2,4,5]
i=k = 0,由于s1[0]=1不在s2中,所以i,k都得加1,
i=j=1,由于s1[1]=2不在s2中,所以i++,k不变(k标志着结果s1的最后一个元素)
i=2,j=1,s1[2]=3,不存在,所以s1[k]=s[i]=3; i,j都加1
依次运算下去
解决方案六:
对了楼主,我和好奇,您那个【s1】和【s2】数组的大小都没有固定,是如何通过编译器的?