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语言中变量先声明后使用的原则.本节内容中指针的操 ...
随机推荐
- (转发)InputAccessoryView的使用方法
转自:http://blog.sina.com.cn/s/blog_45e2b66c01015we9.html UITextFields and UITextViews have an inputAc ...
- 关于UINavigationController的一些技巧
未自定义任何东西的导航条效果如下: 1.自定义了 leftBarButtonItem 之后,左滑返回手势失效了,解决办法: self.navigationController.interactiveP ...
- 关于C与C++的区别
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- PHP计算今天、昨天、本周、本月、上月开始时间和结束时间
PHP计算今天.昨天.本周.本月.上月开始时间和结束时间 $today = date('Y-m-d H:i:s',mktime(0,0,0,date('m'),date('d'),date('Y')) ...
- 【android】android对位图文件的支持
Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).
- winServer08上安装SQL时提示“必须使用管理角色安装”或配置microsoft.net framework 3.5
server 2008安装vs2008后报错,如图: 解决方法: 控制面板—>程序—>打开或关闭Windows功能—>进入服务器管理器选择功能—>添加功能 然后勾选.NET F ...
- 在终端更改MAC的MySQL的root密码
- P3388 【模板】割点(割顶)
P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...
- loj2020 「HNOI2017」礼物
所有的下标从 \(0\) 开始. 考虑枚举 \(C\) (第一个加上负的等于第二个加上其绝对值)和第二个手链的偏移量 \(p\).答案就是 \[\sum_{i=0}^{n-1}(x_i+C-y_{(i ...
- python - log日志
# -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_logging.py @ide: PyCharm Comm ...