一、通过字符串传递函数

    1、定义:可以使用函数名(字符串)调用函数,也可以使用函数指针调用函数,将两者结合

    2、特征:

      1)、在函数声明时使用函数指针

      2)、调用函数时使用函数名称(字符串)

      3)、可以让函数的调用更加灵活方便

    3、应用代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. char *stringToLower(const char *string){
  7. char *tmp = (char *)malloc(strlen(string) + );
  8. char *start = tmp;
  9. while(*string != ){
  10. *tmp++ = tolower(*string++);
  11. }
  12. *tmp = ;
  13.  
  14. return start;
  15. }
  16.  
  17. int compare(const char *s1, const char *s2){
  18. return strcmp(s1, s2);
  19. }
  20.  
  21. int compareIgnoreCase(const char *s1, const char *s2){
  22. char *t1 = stringToLower(s1);
  23. char *t2 = stringToLower(s2);
  24. int result = strcmp(t1, t2);
  25.  
  26. free(t1);
  27. free(t2);
  28.  
  29. return result;
  30. }
  31.  
  32. typedef int (fptrOperation)(const char *, const char *);
  33.  
  34. void sort(char *array[], int size, fptrOperation operation){
  35. int swap = ;
  36. while(swap){
  37. swap = ;
  38. for(int i = ; i < size - ; i++){
  39. if(operation(array[i], array[i + ]) > ){
  40. swap = ;
  41. char *tmp = array[i];
  42. array[i] = array[i + ];
  43. array[i + ] = tmp;
  44. }
  45. }
  46. }
  47. }
  48.  
  49. void displayArray(char *names[], int size){
  50. for(int i = ; i < size; i++){
  51. printf("%s\t", names[i]);
  52. }
  53.  
  54. printf("\n");
  55. }
  56.  
  57. int main(int argc, char **argv)
  58. {
  59. char *names[] = {"Bob", "Ted", "Carol", "Alice", "dlice",};
  60. int size = sizeof(names);
  61.  
  62. printf("Using compare sort: ");
  63. sort(names, , compare);
  64. displayArray(names, );
  65.  
  66. printf("Using compareIgnore sort: ");
  67. sort(names, , compareIgnoreCase);
  68. displayArray(names, );
  69.  
  70. return ;
  71. }

    代码说明:

      
      1)、stringToLower函数主要是将字符串转换为小写

      2)、compare函数实现字符串的比较,区分大小写

      3)、compareIgnoreCase函数实现字符串的比较,不区分大小写

      
      4)、sort函数实现字符串的排序

      5)、displayArray函数主要用来显示字符串

      6)、main函数主要用来测试实现的功能是否正常

      
      7)、第32行代码定义函数指针fptrOperation

      8)、第63行,调用字符串和自行指定比较函数(区分大小写比较),实现字符串的比较

      9)、第67行,调用字符串和自行指定比较函数(不区分大小写比较),实现字符串的比较

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. char *stringToLower(const char *string){
  7. char *tmp = (char *)malloc(strlen(string) + );
  8. char *start = tmp;
  9. while(*string != ){
  10. *tmp++ = tolower(*string++);
  11. }
  12. *tmp = ;
  13.  
  14. return start;
  15. }
  16.  
  17. int compare(const char *s1, const char *s2){
  18. return strcmp(s1, s2);
  19. }
  20.  
  21. int compareIgnoreCase(const char *s1, const char *s2 ){
  22. char *t1 = stringToLower(s1);
  23. char *t2 = stringToLower(s2);
  24.  
  25. int result = strcmp(t1, t2);
  26. free(t1);
  27. free(t2);
  28.  
  29. return result;
  30. }
  31.  
  32. typedef int (fptrOperation)(const char*, const char *);
  33.  
  34. void sort(char *array[], int size, fptrOperation operation){
  35. int swap = ;
  36. while(swap){
  37. swap = ;
  38. for(int i = ; i < size; i++){
  39. if(operation(array[i], array[i + ]) > ){
  40. char *tmp = array[i];
  41. array[i] = array[i + ];
  42. array[i + ] = tmp;
  43. }
  44. }
  45. }
  46. }
  47.  
  48. void displayArr(char *names[], int size){
  49. for(int i = ; i < size; i++){
  50. printf("%s\t", names[i]);
  51. }
  52.  
  53. printf("\n");
  54. }
  55.  
  56. int main(int argc, char **argv)
  57. {
  58. char *names[] = {"Bob", "Ted", "Carol", "alice", "Dlice",};
  59.  
  60. sort(names, , compare);
  61. displayArr(names, );
  62.  
  63. sort(names, , compareIgnoreCase);
  64. displayArr(names, );
  65.  
  66. return ;
  67. }

    

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. 解决cocos simpleAudioEngine播放mp3失败问题

    今天用cocos3.x版本实现游戏音乐播放发现一个坑,策划发来的mp3格式音频,用 simpleAudioEngine无法播放, 以为是路径问题,断点调试没找到,然后拷贝了cocos自带的mp3音频文 ...

  2. iOS中的数据存储方式_Plist

    plist文件只能存储OC常用数据类型(NSString.NSDictionary.NSArray.NSData.NSNumber等类型)而不能直接存储自定义模型对象; 我们拿NSData举例: /* ...

  3. 配置淘宝镜像,不使用怪异的cnpm

    npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...

  4. mysqlfailover高可用与proxysql读写分离配置

    proxysql官方推荐两种高可用方案: 1.MHA+proxysql 2.mysqlrpladmin+proxysql MySQLfailover工具包含在mysqlrpladmin工具中,所以两者 ...

  5. Python + Bottle + 谷歌搜索Api 实现简单搜索引擎

    1.运行环境 python3 centos7 2.Bottle的使用 使用bottle主要是因为它仅用python自带的库即可实现对web的搭建. bottle源码分析 bottle使用教程 3.代码 ...

  6. 使用Spring MVC后实现一个BaseController

    使用Spring MVC技术后,可以实现一个基类的Controller类来分装一些MVC常用的方法,其他的Controller都继承自这个BaseController,这样在使用常用的方法时将会变得非 ...

  7. 使用el-checkbox实现全选,点击失效没有反应

    最近在公司接收到了一个需求,给收藏夹的书籍添加批量.全选删除实现思路:点击全选改变item的checked,改变item的checked,重新便利一下所有item的checked来改变全选的selec ...

  8. leetcode-11-dfs

    DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...

  9. 2018 Multi-University Training Contest 1 Distinct Values(set)

    题意: t组数据,每组数据给定n,m, 表示有m个约束,每个约束包含 x,y ,代表区间 [x, y] 里的数字不能相同. 让你用所有的正整数构成一个长度为 n 的区间,使得这个区间元素顺序的字典序最 ...

  10. 记一次虚拟机无法挂载volume的怪异问题排查

    故障现象 使用nova volume-attach <server> <volume>命令挂载卷,命令没有返回错误,但是查看虚拟机状态,卷并没有挂载上. 故障原因 疑似虚拟机长 ...