今天遇到了一个问题,题目大意是输入两个字符串,然后给这两个字符串按照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行,一开始没有加*,所以成为一个死循环。所以,不仅要考虑全局,还要注意小的细节。
时间: 2024-12-28 01:22:01