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语言中变量先声明后使用的原则.本节内容中指针的操 ...
随机推荐
- cocos2dx lua 吞噬层的触摸事件
首先要创建一个layer,设置该层为可触摸 layer:setTouchEnabled(true) 注册触摸事件 local listener = cc.EventListenerTouchOneBy ...
- 【转】VC自定义消息
MFC一般可利用ClassWizard类向导添加消息和消息处理函数,但用户自定义消息必须手工输入,现将vc自定义消息方法步骤记录如下: (1)定义消息 利用#define语句直接定义用户自己的消息(既 ...
- 【主席树】bzoj1112: [POI2008]砖块Klo
数据结构划一下水 Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. ...
- PHP数组函数 array_multisort() ----对多个数组或多维数组进行排序
PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...
- COMP9021--6.6
1. 在print结尾处添加end='' print默认在字符串结尾处添加换行符,添加end=''后表示这个语句并没有结束,结尾不换行 2. 为了减少重复代码以及便于修改,我们可以编写函数 1) 函数 ...
- JDK1.8 HashMap$TreeNode.balanceInsertion 红黑树平衡插入
红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) ...
- App架构经验总结
作者:李纪钢,网名 Keegan小钢,博客地址:http://keeganlee.me.目前在广州日报新媒体有限公司,负责移动产品的研发工作. 关于:本文整理自CSDN架构主题月子活动金牌架构师微课堂 ...
- LA 3790 Overlapping Squares DFS
题意: 给出一个字符矩阵,问能否是不超过6个2×2的正方形组成的. 分析: 每次找一个最表面的正方形然后DFS就好了. 一个正方形被移开后,用一个特殊符号标记上,下次再匹配的时候就直接忽略这些位置. ...
- luogu3369 【模板】普通平衡树(Treap/SBT) treap splay
treap做法,参考hzwer的博客 #include <iostream> #include <cstdlib> #include <cstdio> using ...
- 微信小程序开发 -- 手机振动
wx.vibrateLong(OBJECT) wx.vibrateLong(OBJECT) 方法使手机发生较长时间的振动(400ms) OBJECT参数说明: 参数名 类型 必填 说明 success ...