模拟实现qsort atoi函数,小白快来看
Posted 程序猿是小贺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟实现qsort atoi函数,小白快来看相关的知识,希望对你有一定的参考价值。
qsort函数
qsort函数C语言编译器函数库自带的排序函数。qsort 的函数原型是void qsort(voidbase,size_t num,size_t width,int(__cdeclcompare)(const void*,const void*)); 是base所指数组进行排序。qsort函数包含在C 标准库 - <stdlib.h>中。
函数简介
函数声明
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void))
参数
- base-- 指向要排序的数组的第一个元素的指针。
- nitems-- 由 base 指向的数组中元素的个数。
- size-- 数组中每个元素的大小,以字节为单位。
- compar-- 用来比较两个元素的函数,即函数指针(回调函数)
回调函数:
回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
功 能
使用排序例程进行排序。
说明
该函数不返回任何值。
头文件:stdlib.h;
模拟实现qsort
此处以整型int为例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
void bubble(void* base, size_t num, size_t width, int compare(const void*, const void*))
{
char *p = (char *)base;
for (int i = 0; i < num - 1; i++)
{
for (int j = 0; j < num - 1 - i; j++)
{
char *p1 = p + j*width;
char* p2 = p + (j + 1)*width;
//比较两个元素,相当于base[i]=base[j+1]
if (compare(p1, p2)> 0)
{
void *tmp = malloc(width);
//内存拷贝函数;函数原型为void *memcpy(void *destin, void *source, unsigned n);
//函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,
//即从源source中拷贝n个字节到目标destin中
memcpy(tmp, p1, width); //tmp = base[j]
memcpy(p1, p2, width); //base[j]=base[j+1]
memcpy(p2, tmp, width); //base[j+1]=tmp
free(tmp);
}
}
}
}
int compare(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
int main(void)
{
int ar[] = { 4, 23, 8, 76, 79, 9, 6, 3, 34, 75, 45, 254, 687 };
int n = sizeof(ar) / sizeof(ar[0]);
bubble(ar, n, sizeof(int), compare);
for (int i = 0; i < n; i++)
{
printf("%d ", ar[i]);
}
system("pause");
return 0;
}
下面是其他类型的接口函数,可以参考一下
//结构体
typedef struct stu{
int id;
char name;
int num;
}s;
int struct_cmp(const void*e1, const void*e2)
{
return ((s*)e1)->id - ((s*)e2)->id;
}
//double型
int double_cmp(const void*e1, const void*e2)
{
return *(double *)e1 - *(double *)e2;
}
//字符串型char*
int str_cmp(const void*e1, const void*e2)
{
return strcmp(*(char **)e1, *(char **)e2);
}
atoi
atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1] 。特别注意,该函数要求被转换的字符串是按十进制数理解的。atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。
函数简介
原型
int atoi(const char *nptr);
模拟实现atoi
注意
1.数据在计算的时候,要考虑溢出问题!
//2.出错的时候,报错信息,绝对不可以用返回值判定
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
#include<assert.h>
enum{
OK,
ERR,
};
int err_code = OK;
int my_atoi(const char *str)
{
assert(str);
const char *start = str;
while (*start){
if (isspace(*start)){
start++;
}
else{
break;
}
}
if (*start == '\\0'){
err_code = ERR;
return 0;
}
int flag = 1;
if (*start == '-'){
start++;
flag = -flag;
}
else if (*start == '+'){
start++;
}
else{
//Do Nothing!
}
long long ret = 0;
while (*start && isdigit(*start)){
ret = ret * 10 + flag*(*start - '0');
if (ret > INT_MAX || ret < INT_MIN){
err_code = ERR;
return 0;
}
start++;
}
return (int)ret;
}
int main()
{
int a = my_atoi("-1245ds146");
if (err_code == OK){
printf("%d\\n", a);
}
else{
printf("INVALID\\n");
}
}
执行结果:
-1245
以上是关于模拟实现qsort atoi函数,小白快来看的主要内容,如果未能解决你的问题,请参考以下文章