代码求解,拜托了,大神抱大腿

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]!='\0';i++)
for(j=0;s2[j]!='\0';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("%s\n",s1);
    return 0;
}
void squeeze(char s1[],char s2[])
{
    int i,j,k;
    k=0;
    for(i=0;s1[i]!='\0';i++)
    {
        for(j=0;s2[j]!='\0';j++)
        {
            if (s1[i]==s2[j])
                break;      
        }
        if(s2[j]=='\0')
            s1[k++]=s1[i];

    }
    s1[k]='\0'; 

}

首先,数组s1和s2连数组大小都没有....
然后,squeeze函数写错了。我看你的代码,大概思路是对s1的每个元素都判断一遍s2中是否存在相同元素,如果不存在,就保留这个元素。
但是!但是,你应该等到s2数组遍历完了以后才能判断有没有相同元素啊,你这里一旦s1【i】!=s2【j】,立马就判断是不存在相同元素了。
附上我改过之后的squeeze的函数:
void squeeze(char s1[],char s2[])
{
for(int i=0;s1[i]!='\0';i++)
{
int flag=0;
for(int j=0;s2[j]!='\0';j++)
if (s1[i]==s2[j])
flag=1;
if(flag)
{
int k=i;
while(s1[k]!='\0')
{
s1[k]=s1[k+1];
k++;
}
}
}
}

k一直指着中间结果s1的最后一个元素

for(i=0; s1[i]!='\0'; i++){
            for(j=0; s2[j]!='\0'; j++)
            {
                if(s1[i] == s2[j]){
                    break;
                }
            }
            //s1[i]不在s2中
            if(s2[j] == '\n'){
                s1[k] = s1[i];
                k++;
            }
        }
        s1[k] = '\0'

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】数组的大小都没有固定,是如何通过编译器的?