将一个含有大小写字母的字符串排序号,按照小写在前,大写在后,并且大小写均有序输出
一、给定字符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 定义用于排序的比较函数
static int compare_char(const void *a, const void *b) {
char ca = *(char *)a;
char cb = *(char *)b;
// 先根据字母大小进行升序排列
if (tolower(ca) != tolower(cb)) {
return tolower(ca) - tolower(cb);
}
// 如果两者转换为小写后相等,则大写字母排在后面
return isupper(ca) - isupper(cb);
}
void sort_string_case_insensitive(char *str) {
// 首先获取字符串长度
size_t len = strlen(str);
// 将字符串转换为字符数组,以便于使用qsort函数排序
char *chars = malloc(len + 1);
strcpy(chars, str);
// 对字符数组进行排序
qsort(chars, len, sizeof(char), compare_char);
// 将排序后的字符数组复制回原字符串
strcpy(str, chars);
// 释放临时分配的内存
free(chars);
}
int main() {
char str[] = "Hello World! This is a Test.";
printf("Before sorting: %s\n", str);
sort_string_case_insensitive(str);
printf("After sorting: %s\n", str);
return 0;
}
二、用户自定义输入
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 定义用于排序的比较函数
static int compare_char(const void *a, const void *b) {
char ca = *(char *)a;
char cb = *(char *)b;
// 先根据字母大小进行升序排列
if (tolower(ca) != tolower(cb)) {
return tolower(ca) - tolower(cb);
}
// 如果两者转换为小写后相等,则大写字母排在后面
return isupper(ca) - isupper(cb);
}
void sort_string_case_insensitive(char *str) {
// 获取字符串长度
size_t len = strlen(str);
// 将字符串转换为字符数组,以便于使用qsort函数排序
char *chars = malloc(len + 1);
strcpy(chars, str);
// 对字符数组进行排序
qsort(chars, len, sizeof(char), compare_char);
// 将排序后的字符数组复制回原字符串
strcpy(str, chars);
// 释放临时分配的内存
free(chars);
}
int main() {
char input[100];
printf("Enter a string: ");
fgets(input, sizeof(input), stdin); // 读取用户输入,包含换行符
// 移除末尾的换行符
input[strcspn(input, "\n")] = '\0';
printf("Before sorting: %s\n", input);
sort_string_case_insensitive(input);
printf("After sorting: %s\n", input);
return 0;
}