zoukankan      html  css  js  c++  java
  • 关于字符串排序合并的问题

     今天遇到了一个问题,题目大意是输入两个字符串,然后给这两个字符串按照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)!='';head++)                    //用选择排序法按ASCII给字符串排序
     8     {
     9         min=head;                                        //用min来记录ASCII码值最小的字符
    10         for(next=head+1;(*next)!='';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]='';                            //给str的末尾加上字符串结束符
    27     sort(str);                                            //按码值对str进行排序
    28     for(p=str;*p!='';p++)                                //利用选择排序的方法检索字符串中相同的字符
    29     {
    30         for(next=p+1;*next!='';next++)
    31         {
    32             if(*p==*next)                                //如果前面一个字符和后面的字符相等
    33             {
    34                 for(;*next!='';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
    ",str1);
    55     printf("排序后的字符串2为%s
    ",str2);
    56     join(str1,str2,str);
    57     printf("合并后的字符串为%s
    ",str);
    58     return 0;
    59 }

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

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

  • 相关阅读:
    c#冒泡排序
    C# 虚方法(virtual)覆盖(override) 隐藏(new) 重载
    Javascript 大括号
    C# const.static.readonly.
    热点链接(img map area)
    WeiBo返回错误码的二种方式
    Cookie跨域操作
    synchronized(this)与synchronized(class)
    线程安全场景备忘
    git新建一个分支setupstream
  • 原文地址:https://www.cnblogs.com/kingos/p/4528801.html
Copyright © 2011-2022 走看看