34深入理解C指针之---通过字符串传递函数
一、通过字符串传递函数
1、定义:可以使用函数名(字符串)调用函数,也可以使用函数指针调用函数,将两者结合
2、特征:
1)、在函数声明时使用函数指针
2)、调用函数时使用函数名称(字符串)
3)、可以让函数的调用更加灵活方便
3、应用代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> char *stringToLower(const char *string){
char *tmp = (char *)malloc(strlen(string) + );
char *start = tmp;
while(*string != ){
*tmp++ = tolower(*string++);
}
*tmp = ; return start;
} int compare(const char *s1, const char *s2){
return strcmp(s1, s2);
} int compareIgnoreCase(const char *s1, const char *s2){
char *t1 = stringToLower(s1);
char *t2 = stringToLower(s2);
int result = strcmp(t1, t2); free(t1);
free(t2); return result;
} typedef int (fptrOperation)(const char *, const char *); void sort(char *array[], int size, fptrOperation operation){
int swap = ;
while(swap){
swap = ;
for(int i = ; i < size - ; i++){
if(operation(array[i], array[i + ]) > ){
swap = ;
char *tmp = array[i];
array[i] = array[i + ];
array[i + ] = tmp;
}
}
}
} void displayArray(char *names[], int size){
for(int i = ; i < size; i++){
printf("%s\t", names[i]);
} printf("\n");
} int main(int argc, char **argv)
{
char *names[] = {"Bob", "Ted", "Carol", "Alice", "dlice",};
int size = sizeof(names); printf("Using compare sort: ");
sort(names, , compare);
displayArray(names, ); printf("Using compareIgnore sort: ");
sort(names, , compareIgnoreCase);
displayArray(names, ); return ;
}
代码说明:
1)、stringToLower函数主要是将字符串转换为小写
2)、compare函数实现字符串的比较,区分大小写
3)、compareIgnoreCase函数实现字符串的比较,不区分大小写
4)、sort函数实现字符串的排序
5)、displayArray函数主要用来显示字符串
6)、main函数主要用来测试实现的功能是否正常
7)、第32行代码定义函数指针fptrOperation
8)、第63行,调用字符串和自行指定比较函数(区分大小写比较),实现字符串的比较
9)、第67行,调用字符串和自行指定比较函数(不区分大小写比较),实现字符串的比较
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> char *stringToLower(const char *string){
char *tmp = (char *)malloc(strlen(string) + );
char *start = tmp;
while(*string != ){
*tmp++ = tolower(*string++);
}
*tmp = ; return start;
} int compare(const char *s1, const char *s2){
return strcmp(s1, s2);
} int compareIgnoreCase(const char *s1, const char *s2 ){
char *t1 = stringToLower(s1);
char *t2 = stringToLower(s2); int result = strcmp(t1, t2);
free(t1);
free(t2); return result;
} typedef int (fptrOperation)(const char*, const char *); void sort(char *array[], int size, fptrOperation operation){
int swap = ;
while(swap){
swap = ;
for(int i = ; i < size; i++){
if(operation(array[i], array[i + ]) > ){
char *tmp = array[i];
array[i] = array[i + ];
array[i + ] = tmp;
}
}
}
} void displayArr(char *names[], int size){
for(int i = ; i < size; i++){
printf("%s\t", names[i]);
} printf("\n");
} int main(int argc, char **argv)
{
char *names[] = {"Bob", "Ted", "Carol", "alice", "Dlice",}; sort(names, , compare);
displayArr(names, ); sort(names, , compareIgnoreCase);
displayArr(names, ); return ;
}
34深入理解C指针之---通过字符串传递函数的更多相关文章
- 33深入理解C指针之---通过字符串传递数据
一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 31深入理解C指针之---指针和字符串
一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...
- 深入理解C指针之四:指针和数组
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...
- 深入理解C指针之一:初识指针
原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...
- C 真正理解二级指针
本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...
- 《深入理解C指针》
<深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- 06深入理解C指针之---指针操作和比较
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操 ...
随机推荐
- iOS开发之MVVM在项目中的应用
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 53. Maximum Subarray@python
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- bzoj4666 小z的胡话
题目描述: bz 题解: 乱搞好题哇. 众所周知斐波那契数列是有循环节的. 我们可以搞出在模$10^x$下与所给得数同余的集合,那么在模$10^{x+1}$下,同余集合一定是原集合及循环若干循环节的大 ...
- 02 Django框架基础(APP的创建访问)
一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...
- spring bean的介绍以及xml和注解的配置方法
5.Bean 下边我们来了解一下Bean的: Bean的作用域Bean的生命周期Bean的自动装配Resources和ResourceLoader 5.1Bean容器的初始化 Bean容器的初始化 两 ...
- python numpy模块
目录 numpy模块 一维数组 二维数组(用的最多的) 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的元素的替换 通过函数方法创建多维数组 矩阵的运算 点乘和转置(了解) 点乘必须 m*n ...
- 谈谈你对Hibernate的理解
答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一 ...
- Python头脑风暴2
今天想到了一个致富新途径:假如我在X东上班,我写个X宝爬虫,专门爬在X宝买奢侈品的土豪,然后我自己注册个X宝号,用脚本一个个加他们然后给他们发信息说我X东这还有比你更便宜更好的...不知道行不行啊(狗 ...
- console_init()分析
启动阶段初始化控制台流程分析, start_kernel console_init(); -->tty_ldisc_begin(); /* Setup the default TTY line ...
- poj 1328 安雷达问题 贪心算法
题意:雷达如何放置?在xoy二维平面坐标系里面,x轴上方的为岛屿,x轴下方的是雷达要放到位置,如何放使得雷达放的最少? 思路 肯定放在x轴上减少浪费是最好的选择 什么情况下,雷达无法到达呢?--以这个 ...