一、通过字符串传递函数

    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指针之---通过字符串传递函数的更多相关文章

  1. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  2. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  3. 31深入理解C指针之---指针和字符串

    一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...

  4. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  5. 深入理解C指针之一:初识指针

    原文:深入理解C指针之一:初识指针 简单来说,指针包含的就是内存地址.理解指针关键在于理解C的内存管理模式.C里面有三种内存: ①.静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静 ...

  6. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

  7. 《深入理解C指针》

    <深入理解C指针> 基本信息 原书名:Understanding and using C pointers 作者: (美)Richard Reese 译者: 陈晓亮 丛书名: 图灵程序设计 ...

  8. 深入理解C指针----学习笔记

      深入理解C指针     第1章 认识指针   理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址.     1.1 指针和内存   C程序在编译后,以三种方式使用内存: 1. 静态. ...

  9. 06深入理解C指针之---指针操作和比较

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操 ...

随机推荐

  1. ios 设计模式总结

    设计模式:备注:消息传递模型(Message Passing)是Objective-C语言的核心机制.在Objective-C中,没有方法调用这种说法,只有消息传递.在C++或Java中调用某个类的方 ...

  2. 『jQuery』.html(),.text()和.val()的概述及使用--2015-08-11

    如何使用jQuery中的.html(),.text()和.val()三种方法,用于读取,修改元素的html结构,元素的文本内容,以及表单元素的value值的方法   本节内容主要介绍的是如何使用jQu ...

  3. SAP HANA

    DROP PROCEDURE ""."ZCONCAT_EKKO_EBN"; CREATE PROCEDURE ""."ZCONCA ...

  4. 201621123080 《Java程序设计》第13周学习总结

    201621123080 <Java程序设计>第13周学习总结 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能( ...

  5. vue-highlightjs的使用小结

    万能的github真主,让我们强大!在vue的项目中想使用highlight.js这样的代码高亮?有人帮助我们实现了vue-highlightjs 安装 yarn add highlight.js - ...

  6. Boostrap的自适应功能

    其实理解栅栏模式之后,自适应功能就简单很多了,根据浏览器的大小,Boostrap有四种栅栏类名提供使用,用法与Css样式表类名选择器样式调用是一样的: xs:col-xs-1 ~ col-xs-12, ...

  7. HUD:2853-Assignment(KM算法+hash)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Assignment Time Limit: 2000/1000 MS (Java/Others) ...

  8. Leetcode 81. 搜索旋转排序数组 II

    题目链接 https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/ 题目描述 假设按照升序排序的数 ...

  9. PAT Basic 1077

    1077 互评成绩计算 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一 ...

  10. CodeForces 500E New Year Domino

    题意: 从左到右排列着\(n\)个多米诺骨牌,它们分别站在\(x\)轴上的位置\(p_i\)上且高度为\(l_i\). 当第\(i\)个多米诺骨牌向右倒下时,如果\(p_i < p_j \leq ...