求帮看下这道C语言字符串排序题,指针法。

题目是:从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按ASCII码值从小到大排序,并删去相同字符。
编的程序:
#include <stdio.h>
#include <stdlib.h>
strmerge(char *a,char *b,char *c)
{char t,*w;
while(*a!='\0'&&*b!='\0')
{
if(*a<*b)
{
t=*a;
a++;}
else if(*a>*b)
{
t=*b;
b++;}
else
{
t=*a;
a++;
b++;}
}
if(*w=='\0')
{*w=t;}
else if(t!=*w)
{*(++w)=t;}
if(*a!='\0')
{
while(*a!='\0')
{if(*a!=*w)
{*(++w)=*a;
a++;}
else
{a++;}
}
}
}

strsort(char *s)
{ int i,j,n;
char t,*w;
w=s;
for(n=0;*w!=0;n++)
{w++;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(s[i]>s[j])
{ t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
}

int main(int argc, char *argv[])
{
char s1[100],s2[100],s3[100];
printf("Please input the first string:");
scanf("%s",s1);
printf("Please input the second string:");
scanf("%s",s2);
strsort(s1);
strsort(s2);
printf("The sorted string1:%s\n",s1);
printf("The sorted string2:%s\n",s2);
s3[0]='\0';
strmerge(s1,s2,s3);
printf("The new string:%s\n",s3);
system("PAUSE");
return 0;
}

哪里出错了?为什么程序会崩溃?

#include <stdio.h>
#include <stdlib.h>
char stra[20];
char strb[20];
char strc[40];       //最终输出结果
char strsum[40];     //用语连接两字符串
//输入字符串
void input(void)
{
 printf("Input string a:\n");
 gets(stra);        //输入字符串最快捷的办法
    printf("Input string b:\n");
 gets(strb); 
    printf("\n\n");  
}
//字符串连接
void connect(char *s1,char*s2)
{
 int i=0;
    int j=0;
    while(*(s1+i)!='\0')   
    {        
  *(strsum+i)=*(s1+i);
        i++;   //把字符串1赋值给空字符串strsum
    }
    while(*(s2+j)!='\0')
    {
  *(strsum+i)=*(s2+j);
        i++;j++;   //把字符串2赋值给字符串strsum
    }
    *(strsum+i)='\0';   //输入字符串自动添加结束符,拼接的话要自己加
}
//字符串排序
void order(char *str)
{
 int len=strlen(str);
    int i,j;
    char ljm;
    for (i=0;i<len;i++)
    {
  for (j=i+1;j<len;j++)
        {
   if(*(str+i)<*(str+j))
            {
    ljm=*(str+i);
                *(str+i)=*(str+j);
                *(str+j)=ljm;
            }
        }
    }
}    //详细参照冒泡法
//去掉相同项
void change(char *str)
{
 int i,len;
    int k=0;
    len=strlen(str);
 for(i=0;i<len;i++)
    {
  if(*(str+i)==*(str+i+1))
        {
   ; //相同部分确保只复制一次
        }
        else
        {
   *(strc+k)=*(str+i);
            k++;
        }
    }
    
}
//输出
void print(char *str)
{
 printf("%s\n\n",str);
}
int main()
{    //设计逻辑:1.输入字符串。2.拼接字符串。3.排序。4.消除相同项。5.输出。
 input();   //1.输入字符串。
    connect(stra,strb);   //2.拼接字符串。
    printf("Connect a and b:\n");
    print(strsum);
    order(strsum);  //3.排序。
    printf("Sort the new string in descending order:\n");
    print(strsum);
    printf("Remove repeated members:\n");
    change(strsum); //4.消除相同项。
    print(strc);   //5.输出。
 system("pause");
 return 0;
}

 

 

 

 

追答

对百度的格式无语了。直接下载我的附件吧。

同学,做人要厚道。提问请采纳好吗

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-22

#include <stdio.h>

#include <stdlib.h>

void strmerge(char *a,char *b,char *c)

{char t,*w;

while(*a!='\0'&&*b!='\0')

{

while(*a==*(a+1))a++;

while(*b==*(b+1))b++;

if(*a<*b)

{ *(c++)=*(a++);}

else if(*a>*b)

  {*(c++)=*(b++);}

else

{*(c++)=*(a++);

  b++;}

}

while(*a!='\0')

  {*(c++)=*(a++);};

while(*b!='\0')

  {*(c++)=*(b++);}

*c='\0';

}

 

void strsort(char *s)

{  int i,j,n;

   char t,*w;

   w=s;

   for(n=0;*w++;n++);

   for(i=0;i<n-1;i++)

    {

     for(j=0;j<n-1-i;j++)

     {

      if(s[j]>s[j+1])

      { t=s[j];

        s[j]=s[j+1];

        s[j+1]=t;

      }

    }

   }

}   

 

int main(int argc, char *argv[])

{

    char s1[100],s2[100],s3[100];

    printf("Please input the first string:");

    scanf("%s",s1);

    printf("Please input the second string:");

    scanf("%s",s2);

    strsort(s1);

    strsort(s2);

    printf("The sorted string1:%s\n",s1);

    printf("The sorted string2:%s\n",s2);

    s3[0]='\0';

    strmerge(s1,s2,s3);

    printf("The new string:%s\n",s3);

    system("PAUSE"); 

    return 0;

}

第2个回答  2016-04-29

一时手痒,自己写了个。

输入是用的命令行参数 app_name str1 str2;然后对str1,str2排序,然后合并

追问

可是你的这个程序也出错了呀?编译说44、45行的for循环有问题。能不能还请帮我看一下我原来的程序呀?

追答

这个for循环是要用C99标准支持的。估计你用的C89.
这里修改可以把变量提到括号外定义。
int i;
int j;
for(i = 0; i < xx; ++i) {
for(j = 0; j < xxx; ++j) {

//hahah

}
}

本回答被网友采纳