字符串排序

153 阅读1分钟

描述

给定n个字符串,请对n个字符串按照字典的顺序排列。
数据范围:1 <= n <=1000 ,字符串长度满足:1 <= len <= 100

输入描述:

输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:

数据输出n行,输出结果为按照字典序排列的字符串。

示例1

输入:  9
        cap
        to
        cat
        card
        two
        too
        up
        boat
        boot
输出:  boat
        boot
        cap
        card
        cat
        to
        too
        two
        up

思路

将字符串存储在数组内,排序后输出即可

实现代码

#include <stdio.h>
//在这里进行变型,比较的数组是个指针数组,需要对指针指向的内容进行比较
int cmp(const char** a, const char** b){
    return strcmp((char *)*a, (char *)*b);
}
int main(){
    int num = 0;
    scanf("%d\n",&num);
    char** str = (char**)malloc(sizeof(char*) * (num));  //指向二维数组,一维数组指针的二级指针 
    char* p = (char*)malloc(sizeof(char) * (num) * 101);   //为二维数组的每个元素分配空间
    memset(p, sizeof(char) * (num) * 101, 0);
    for(int i=0; i<num; i++){
        scanf("%s\n",p+i*101);
        str[i] = p+i*101; //str[i] 是二维数组的一维数组指针  str[i]  = *(str + i)
    }
    //利用strcmp比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。
    //strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,
    //若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。
    qsort(str, num, sizeof(char *), cmp);
    for(int j=0; j<num; j++){
        printf("%s\n",str[j]);
    }
}