合并两个字符串 重复的字符只输出一次 并且按照asii码排序

include<stdio.h>

include<string.h>

void sort(char *p1,char *p2,char p3[])
{
int i=0;
while(*p1!='\0')
{
p3[i]=*p1;
p1++;
i++;
}
p3[i]='\0';

我现在的问题是这里怎么不重复的合并p2的字符到p3

for(i=0;i<strlen(p3)-1;i++)
for(int j=0;j<strlen(p3)-1-i;j++)
{
if(p3[j]>p3[j+1])
{
char t=p3[j+1];
p3[j+1]=p3[j];
p3[j]=t;
}
}
}
int main(void)
{
char str1[100],str2[100],str3[100];
printf("input str a and b:\n");
gets(str1);
gets(str2);
sort(str1,str2,str3);
puts(str3);
return 0;
}

代码如下:

void sort(char *p1,char *p2,char p3[])
{
    int i=0,j,k;
    char ch;
    //p1全部拷贝
    while(*p1!='\0')
    {
        p3[i]=*p1;
        p1++;
        i++;
    }
    //p2-->p3
    while(*p2 != '\0')
    {
        for(j = 0;j<i;j++)
        {
            if(p3[j] == *p2)
                break;
        }
        if(j== i)
            p3[i++] = *p2;
        
        p2++;
    }
    p3[i] = '\0';

    //排序
    for (k = 0;k<i-1;k++)
    {
        for(j=0;j<i-1-k;j++)
        {
            if(p3[j] > p3[j+1])
            {
                ch = p3[j];
                p3[j] = p3[j+1];
                p3[j+1] = ch;
            }
        }
    }

}