函数指针,字符转换(大小写、不动)

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值