关于字符串排序合并的问题

今天遇到了一个问题,题目大意是输入两个字符串,然后给这两个字符串按照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

关于字符串排序合并的问题的相关文章

Openjudge-计算概论(A)-字符串排序

描述 参考整数排序方法,设计一种为字符串排序的算法,将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据.每组数据第一行是n,表示这组数据有n行字符串,接下来是要排序的n行字符串.每行字符串的字符个数不会大于200, n < 100. 输出 对于每组数据,输出排好序的字符串,每组输出后要多输出一个空行 样例输入 2 2 Hello World 4 I Love C Language! 样例输出 Hello World C I Language! Love思路:这题可以把它们全部

gets()、puts()函数。字符串函数。字符串排序的例子。

1.实例程序:string.c的程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include<stdio.h> #define MSG "YOU MUST have many talents .tell me some." #define LIM 5 #define LINELEN 81 int main() { char name[LINELEN]; char

leetCode 179. Largest Number 字符串排序 | Medium

179. Largest Number Given a list of non negative integers, arrange them such that they form the largest number. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330. Note: The result may be very large, so you need to return a st

算法-低位优先的字符串排序

低位优先的字符串排序相当于是对键索引计数方法的一个扩展,主要用于处理固定长度字符串,比如说手机号,固定电话,银行卡卡号,字符串的长度为N,从右向左开始进行每个键作为值开始遍历,实现比较简单: -(void)lowSort:(NSMutableArray *)dataSource singleLength:(NSInteger)len { NSInteger sourceCount=[dataSource count]; NSInteger R=256; NSMutableArray *tempA

九度OJ 1066 字符串排序

题目1066:字符串排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4919 解决:1983 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到大进行排序,请输出排序后的结果 输入: 一个字符串,其长度n<=20 输出: 输入样例可能有多组,对于每组测试样例, 按照ASCII码的大小对输入的字符串从小到大进行排序,输出排序后的结果 样例输入: dcba 样例输出: abcd #include<stdio.h> #include<

字符串排序和多字段排序(string sorting and multi-fields)

被分词的string字段也是一个multi-value字段,但是对他们进行排序往往得不到想要的结果.如果你对"fine old art"进行分词,他将会返回三个term.我们也许对以一个term进行字母排序,然后第二个等.但是ES没有在这个期间的时间顺序. 你可以使用min和max排序模式(默认使用min),但是结果既不是art或者old也不是任何想要的结果. 为了对string field进行排序,这个field就只能是一个term:也就是一个not_analyzed类型的strin

51 nod 1097 拼成最小的数 思路:字符串排序

题目: 思路:1.以字符串输入这些整数. 2.对这些字符串排序,排序规则为尽量让能让结果变小的靠前. 代码中有注释,不懂的欢迎在博客中评论问我. 代码: #include <bits\stdc++.h> using namespace std; string a[10001]; //比较规则:尽量让结果字符串最小 bool cmp(string a,string b){ return a+b <= b+a; } int main(){ int n; cin >> n; for

C语言之函数调用18—多字符串排序

//字符串排序***** /* =============================================================== 对任意个字符串升序排列! =============================================================== */ #include<stdio.h> #include<string.h> #define N 3          //控制排序数量 #define M 100  

oracle表之间的连接之------&gt;排序合并连接(Merge Sort Join)

排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景如下: a,通常情况下,排序合并连接的执行效率远不如哈希连接,但前者的使用范围更广,因为哈希连接只能用于等值连接条件,而排序合并连接还能用于其他连接条件(如<,<=,>.>=) b,通常情况下,排序合并连接并不适合OLTP类型的系统,其本质原因是对于因为OLTP类型系统而言,排序是非常昂贵的操作,当然,如