万能的排序函数 (C语言)

有n个整数,需要对他们进行各种排序:升序排序、降序排序、按个位数升序排序、按十位数降序排序,为了提高代码的重用性,可以用指向函数的指针作排序函数的参数。
程序输入n+2个整数:
第一行是整数n,表示后面有n个整数需要排序
第二行是待排序的n个整数
第三行是排序需求,分别是1-4,依次表示升序排序、降序排序、按个位数升序排序、按十位数降序排序
程序的输出是排好序的n个整数,两个整数之间用空格隔开

函数接口定义:

需要实现以下函数:

void sort(int *p, int (*compare)(int a,int b), int N);
int  Descending(int a, int b);
int bit1_Des(int a, int b);

其中 p 是数据的首地址, N 是需要排序的数据个数, compare 是指向函数的指针。sort函数用选择法进行排序

裁判测试程序样例:

#include <stdio.h>
void sort(int *p, int (*compare)(int a,int b), int N);

int  Ascending(int a, int b);
int  Descending(int a, int b);
int bit0_Asc(int a, int b);
int bit1_Des(int a, int b);

int main()
{  int n=10,k;
   int *s,*p;
   int (*fun)(int,int);
   scanf("%d",&n);
   p=(int*)malloc(n*sizeof(int));
   for(s=p; s<p+n; s++)
    scanf("%d",s);
   scanf("%d",&k);
   switch(k)
   {
       case 1:fun=Ascending; break;
       case 2:fun=Descending; break;
       case 3:fun=bit0_Asc; break;
       case 4:fun=bit1_Des; break;
   }
   sort(p,fun,n);
   for(s=p; s<p+n-1; s++)
    printf("%d ",*s);
   printf("%d\n",*s);
   return 0;
}

int  Ascending(int a, int b)
{ 
    return a>b;
}
int bit0_Asc(int a, int b)
{
    return a%10>b%10;
}

/* 请在这里填写答案 */

输入样例:

11
886 461 856 581 514 272 197 182 564 121 894
3

输出样例:

461 581 121 272 182 514 564 894 856 886 197
#include<stdlib.h>
int  Descending(int a, int b) //降序排序
{
	return a < b; 
}
int bit1_Des(int a, int b) //按十位数降序排序
{
    return a/10%10 < b/10%10;
}
void sort(int *p, int (*compare)(int a,int b), int N)
{
    //用选择法进行排序
	int i,j,k,t;
	for(i=0;i<N-1;i++)
	{
		k=i;
		for(j=i+1;j<N;j++)
		{
			if((*compare)(*(p+k),*(p+j))) //如果返回值为真
				k=j;
		}
		if(k!=i)
		{
			t=*(p+i);
			*(p+i)=*(p+k);
			*(p+k)=t;
		}
	}
}

 

 

<think>好的,我需要帮用户找到如何在C语言中实现一个通用的字符串比较函数的示例代码。首先,我得回忆一下C语言中字符串比较的相关知识。C标准库中有strcmp函数,用于比较两个字符串,但用户可能希望自定义一个通用的比较函数,比如用于qsort中的回调函数。 根据引用[4],用户可能是在处理字符串排序时遇到了问题,所以需要比较函数。qsort函数需要传入一个比较函数,该函数的参数是两个const void指针,指向要比较的元素。因此,通用的比较函数需要将void指针转换为字符指针的指针,也就是char**,然后解引用得到实际的字符串指针,再使用strcmp进行比较。 接下来,我需要确认如何正确地进行类型转换。比如,在比较函数中,参数是const void* a和b,那么应该将它们转换为const char**,然后解引用得到char*,这样才能正确调用strcmp。例如:const char* s1 = *(const char**)a; const char* s2 = *(const char**)b; return strcmp(s1, s2); 然后,我需要编写示例代码,展示如何定义这个比较函数,并在qsort中使用它。例如,定义一个字符串数组,然后使用qsort进行排序,其中比较函数就是自定义的通用函数。同时,可能需要处理不同的比较需求,比如大小写不敏感的比较,这时候可能需要另一个版本的比较函数,比如使用strcasecmp或者自己实现字符逐个比较并转换为小写或大写。 另外,用户可能希望比较函数不仅能用于排序,还能在其他需要比较字符串的地方使用。因此,需要确保函数的通用性,参数和返回值的正确性。例如,比较函数的返回值应为整数,负数表示小于,正数表示大于,零表示相等,这与strcmp的返回值一致。 最后,需要测试代码是否正确,比如创建测试用例,排序后的结果是否符合预期。同时,提醒用户在使用时注意字符串的有效性和指针的正确解引用,避免空指针或无效指针导致的错误。</think>### C语言实现字符串比较的通用函数 在C语言中,实现字符串比较的通用函数通常需要以下步骤: 1. **定义函数参数**:使用`const void *`类型指针接收要比较的字符串地址,以适应不同场景(如`qsort`函数的需求)。 2. **类型转换**:将`void *`指针转换为字符串指针(`char **`),并通过解引用获取实际字符串。 3. **调用标准库函数**:使用`strcmp`进行字符串比较,或自定义逻辑(如大小写不敏感比较)。 #### 示例代码(标准比较函数): ```c #include <stdio.h> #include <string.h> // 通用字符串比较函数(按字典序) int compare_strings(const void *a, const void *b) { const char *s1 = *(const char **)a; // 转换为字符指针的指针,再解引用 const char *s2 = *(const char **)b; return strcmp(s1, s2); // 直接返回strcmp结果 } // 示例使用场景(配合qsort排序字符串数组) int main() { const char *strings[] = {"apple", "banana", "cherry", "date"}; int count = sizeof(strings) / sizeof(strings[0]); qsort(strings, count, sizeof(char *), compare_strings); for (int i = 0; i < count; i++) { printf("%s\n", strings[i]); } return 0; } ``` #### 扩展示例(大小写不敏感比较): ```c #include <ctype.h> int compare_strings_case_insensitive(const void *a, const void *b) { const char *s1 = *(const char **)a; const char *s2 = *(const char **)b; while (*s1 && *s2) { int diff = tolower(*s1) - tolower(*s2); if (diff != 0) return diff; s1++; s2++; } return *s1 - *s2; // 处理长度不同的情况 } ``` ### 关键点说明 1. **参数类型转换**:`qsort`要求比较函数参数为`const void *`,需通过`*(const char **)a`获取实际字符串地址[^4]。 2. **返回值逻辑**:直接复用`strcmp`的返回值(负数表示小于,正数表示大于,0表示相等)。 3. **扩展场景**:若需自定义逻辑(如忽略大小写),需手动遍历字符并处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyh_fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值