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语言中变量先声明后使用的原则.本节内容中指针的操 ...
随机推荐
- 解决cocos simpleAudioEngine播放mp3失败问题
今天用cocos3.x版本实现游戏音乐播放发现一个坑,策划发来的mp3格式音频,用 simpleAudioEngine无法播放, 以为是路径问题,断点调试没找到,然后拷贝了cocos自带的mp3音频文 ...
- iOS中的数据存储方式_Plist
plist文件只能存储OC常用数据类型(NSString.NSDictionary.NSArray.NSData.NSNumber等类型)而不能直接存储自定义模型对象; 我们拿NSData举例: /* ...
- 配置淘宝镜像,不使用怪异的cnpm
npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...
- mysqlfailover高可用与proxysql读写分离配置
proxysql官方推荐两种高可用方案: 1.MHA+proxysql 2.mysqlrpladmin+proxysql MySQLfailover工具包含在mysqlrpladmin工具中,所以两者 ...
- Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
1.运行环境 python3 centos7 2.Bottle的使用 使用bottle主要是因为它仅用python自带的库即可实现对web的搭建. bottle源码分析 bottle使用教程 3.代码 ...
- 使用Spring MVC后实现一个BaseController
使用Spring MVC技术后,可以实现一个基类的Controller类来分装一些MVC常用的方法,其他的Controller都继承自这个BaseController,这样在使用常用的方法时将会变得非 ...
- 使用el-checkbox实现全选,点击失效没有反应
最近在公司接收到了一个需求,给收藏夹的书籍添加批量.全选删除实现思路:点击全选改变item的checked,改变item的checked,重新便利一下所有item的checked来改变全选的selec ...
- leetcode-11-dfs
DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...
- 2018 Multi-University Training Contest 1 Distinct Values(set)
题意: t组数据,每组数据给定n,m, 表示有m个约束,每个约束包含 x,y ,代表区间 [x, y] 里的数字不能相同. 让你用所有的正整数构成一个长度为 n 的区间,使得这个区间元素顺序的字典序最 ...
- 记一次虚拟机无法挂载volume的怪异问题排查
故障现象 使用nova volume-attach <server> <volume>命令挂载卷,命令没有返回错误,但是查看虚拟机状态,卷并没有挂载上. 故障原因 疑似虚拟机长 ...