一、通过字符串传递函数

    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. Search and Replace -freecodecamp算法题目

    Search and Replace 1.要求 使用给定的参数对句子执行一次查找和替换,然后返回新句子. 第一个参数是将要对其执行查找和替换的句子. 第二个参数是将被替换掉的单词(替换前的单词). 第 ...

  2. NodeJS基础入门-Buffer

    Buffer.byteLength console.log(Buffer.byteLength('test')); console.log(Buffer.byteLength('我是C语言爱好者')) ...

  3. C++简易酒店管理系统,实现(查询、入住、退房、楼层选择、退出)功能

    #include <iostream> #include <string.h> #include <stdlib.h> void enter(); void che ...

  4. Shuffle UVA - 12174 尺取法

    题目:题目链接 思路:见紫书,对具体操作方式还不是很理解,代码是从一个题解里看的,以后多回顾下,需要理解 代码: #include <iostream> #include <cstr ...

  5. debiand上安装thunderbird

    deb包下载地址 http://sourceforge.net/projects/ubuntuzilla/files/mozilla/apt/pool/main/t/thunderbird-mozil ...

  6. filter 作用

     过滤器 filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能. filter是一个可以复用的代码片段,可以用来转换HTT ...

  7. Hadoop4.2HDFS测试报告之五

    第二组:文件存储读过程记录 NameNode:1 DataNode:1 本地存储 scp romotepath localpath 500 2 1 23.05 NameNode:1 DataNode: ...

  8. Python虚拟机函数机制之闭包和装饰器(七)

    函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完 ...

  9. webdriver高级应用-js操作滚动条

    1.滑动页面的滚动条到页面最下面 2.滑动页面的滚动条到页面的某个元素 3.滑动页面的滚动条向下移动某个数量的像素 #encoding=utf-8 from selenium import webdr ...

  10. Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)

    题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: Given this linked list: 1->2->3->4-> ...