示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //C99特性
#include <string.h>
#include <math.h>
#include <ctype.h>
//函数指针指向函数代码起始处的内存地址
//要注意运算符*的优先级
//void (*pf)(char *); //pf是一个指向函数的指针
//void *pf(char *); //pf是一个返回字符指针的函数
/*
提示:
要声明一个指向特定类型函数的指针,可以先声明一个该类型的函数,然后把函数名替换成(*pf)
形式的表达式。然后,pf就成为指向该类型函数的指针。
*/
#define LEN 81
char* s_gets(char *st, int n);
char showmenu(void);
void eatline(void); // 读取至行末尾
void show(void(*fp)(char *), char * str);
void ToUpper(char *); // 把字符串转换为大写
void ToLower(char *); // 把字符串转换为小写
void Transpose(char *); // 大小写转置
void Dummy(char *); // 不更改字符串
//typedef void (*V_FP_CHARP) (char *);
int main(int argc, char* argv[])
{
char line[LEN];
char copy[LEN];
char choice;
// 声明一个函数指针,被指向的函数接受char *类型的参数,无返回值
void (*pfun) (char *);
//或者这样声明
//V_FP_CHARP pfun;
pfun = Dummy;
puts("Enter a string (empty line to quit):");
while (s_gets(line, LEN) != NULL && line[0] != '\0')
{
while ((choice = showmenu()) != 'n')
{
switch (choice)
{
//函数名代表函数的地址
//注意:只能把类型匹配的函数地址赋给pfun
case 'u': pfun = ToUpper; break;
case 'l': pfun = ToLower; break;
case 't': pfun = Transpose; break;
case 'o': pfun = Dummy; break;
}
strcpy(copy, line); // 为show()函数拷贝一份
show(pfun, copy); // 根据用户的选择,使用选定的函数
}
puts("Enter a string (empty line to quit):");
}
puts("Bye!");
system("pause");
return 0;
}
char showmenu(void)
{
char ans;
puts("Enter menu choice:");
puts("u) uppercase l) lowercase");
puts("t) transposed case o) original case");
puts("n) next string");
ans = getchar(); // 获取用户输入
ans = tolower(ans); // 转换为小写
eatline(); //清理输入
//判断输入的字符是否包含在ulton字符串中
while (strchr("ulton", ans) == NULL)
{
puts("Please enter a u, l, t, o, or n:");
ans = tolower(getchar());
eatline();
}
return ans;
}
void eatline(void)
{
while (getchar() != '\n')
continue;
}
void ToUpper(char* str)
{
while (*str)
{
*str = toupper(*str);
str++;
}
}
void ToLower(char* str)
{
while (*str)
{
*str = tolower(*str);
str++;
}
}
void Transpose(char* str)
{
while (*str)
{
if (islower(*str))
*str = toupper(*str);
else if (isupper(*str))
*str = tolower(*str);
str++;
}
}
void Dummy(char* str)
{
// 不改变字符串
}
//void show(V_FP_CHARP fp, char *)
void show(void(*fp)(char*), char* str)
{
//由于历史原因ANSI C认为下面两种函数调用方式等价
(*fp)(str); // 把用户选定的函数作用于str
//fp(str); //与(*fp)(str)写法等效
puts(str); // 显示结果
}
// 自己实现读取函数
char* s_gets(char* st, int n)
{
char* ret_val;
int i = 0;
ret_val = fgets(st, n, stdin);
if (ret_val) //即,ret_val != NULL
{
while (st[i] != '\n' && st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}
运行测试