#include<stdio.h>
#include<string.h>
#include<ctype.h>
#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 *);// 不更改字符串
int main(void)
{
char line[LEN];
char copy[LEN];
char choice;
void(*pfun)(char*); // 声明一个函数指针,被指向的函数接受char * 类型的参数,无返回值
puts("Enter a string (empty line to quit):");
while (s_gets(line, LEN) != NULL && line[0] != '\0')
{
while ((choice = showmenu()) != 'n')
{
switch (choice)
{
case 'u': pfun = ToUpper;//指向函数的指针中存储着函数代码的起始处的地址
break;
case 'l': pfun = ToLower;//ToLower是该类型函数的地址
break;
case 't': pfun = Transpose;
break;
case 'o': pfun = Dummy;
break;
}
strcpy(copy, line);//为show()函数拷贝一份,减少对原始数据的操作
show(pfun, copy);//copy是数组首地址,指向char类型值(相当于数据指针了)
}
puts("Enter a string (empty line to quit):");
}
puts("Bye!");
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(); // 清理输入行
while (strchr("ulton", ans) == NULL)//判断输入的字符,在ulton这五个里面否
{
puts("Please enter a u, l, t, o, or n:");
ans = tolower(ans);
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 Dummy(char *str)
{
//不改变字符串
}
void Transpose(char *str)
{
while (*str)
{
if (islower(*str))
{
*str = toupper(*str);
}
else if (isupper(*str))
{
*str = tolower(*str);
}
str++;
}
}
void show(void(*pfun)(char *), char *str)
{
(*pfun)(str);//把用户选定的函数作用于str : 相当于 void ToLower(char *str)
puts(str);//字符转换完成后,输出字符
}
char *s_gets(char *st, int n)
{
char *ret_val;
char *find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n');
if (find)
*find = '\0';//让其形成一个完整的字符串
else
while (getchar() != '\n')//处理掉不需要的字符
continue;
}
return ret_val;
}
函数指针,字符转换(大小写、不动)
最新推荐文章于 2022-10-03 15:18:44 发布