今天遇到了一个问题,题目大意是输入两个字符串,然后给这两个字符串按照ASCII码从小到大进行排序,最后在将两个字符串合并,要求删除其中相同的字符。一开始的时候感觉挺简单的一道题,但是做起来还是小毛病挺多的。还是直接看代码吧,代码里面的注释有许多需要注意的地方。

 1 #include<stdio.h>
 2 #include<string.h>
 3 void sort(char *p)                                        //给字符串排序,参数为字符串首地址
 4 {
 5     char temp;
 6     char *head,*min,*next;
 7     for(head=p;(*head)!='\0';head++)                    //用选择排序法按ASCII给字符串排序
 8     {
 9         min=head;                                        //用min来记录ASCII码值最小的字符
10         for(next=head+1;(*next)!='\0';next++)
11         {
12             if((*min)>(*next))
13                 min=next;
14         }
15         temp=*head;                                        //一趟比较完成之后交换
16         *head=*min;
17         *min=temp;
18     }
19 
20 }
21 void join(char *str1,char *str2,char *str)                //将字符串连接起来并去掉相同的字符,参数为两个有内容的字符串和一个大的空的字符串
22 {
23     char *p,*next;
24     strcat(str,str1);                                    //用字符串连接函数将str1和str2连接到一起,放到空的str中
25     strcat(str,str2);
26     str[strlen(str)+1]='\0';                            //给str的末尾加上字符串结束符
27     sort(str);                                            //按码值对str进行排序
28     for(p=str;*p!='\0';p++)                                //利用选择排序的方法检索字符串中相同的字符
29     {
30         for(next=p+1;*next!='\0';next++)
31         {
32             if(*p==*next)                                //如果前面一个字符和后面的字符相等
33             {
34                 for(;*next!='\0';next++)                //把后面的字符全部前移一位,覆盖掉相同字符
35                     *next=*(next+1);
36             }
37             else                                        //如果不相等,直接跳出比较下一个字符与它之后的字符
38                 break;
39         }
40     }
41 
42 }
43 int main()
44 {
45     char str1[10]=" ";
46     char str2[10]=" ";
47     char str[20]=" ";                                    //要先将str赋值为空,否则连接字符串的时候会出现问题
48     printf("请输入字符串1:");
49     scanf("%s",str1);
50     sort(str1);
51     printf("请输入字符串2:");
52     scanf("%s",str2);
53     sort(str2);
54     printf("排序后的字符串1为%s\n",str1);
55     printf("排序后的字符串2为%s\n",str2);
56     join(str1,str2,str);
57     printf("合并后的字符串为%s\n",str);
58     return 0;
59 }

上篇复习了下选择排序法,这个程序就当是熟悉巩固下。其中第24和25行,如果不把str数组初始化为空,那么连接后的字符串输出会出现各种错误。

还有一个判断的失误,在程序的第28行和30行,一开始没有加*,所以成为一个死循环。所以,不仅要考虑全局,还要注意小的细节。