函数指针和菜单实现
程序代码:
程序代码:#include<stdio.h>
#include<string.h>
#include<ctype.h>
char showmenu(void);
void eatline(void); //清空行
void show(void(* fp)(char * str),char *str);//在函数中调用函数,输出字符串
void ToUpper(char *);//字符串转大写
void ToLower(char *);//字符串转小写
void Transpose(char *);//大小写转置
void Dummy(char *);
int main(void)
{
char line[81];
char copy[81];
char choice;
void (*pfun)(char *);//函数指针 指向的函数接受一个char * 参数 并且没有返回值
puts("Enter a string (empty line to quit):");
while(gets(line)!=NULL && line[0]!='\0')
{
while((choice=showmenu())!='n')
{
switch(choice)//根据选择设置指针
{
case 'u':pfun=ToUpper;break;
case 'l':pfun=ToLower;break;
case 't':pfun=Transpose;break;
case 'o':pfun=Dummy;break;
}
strcpy(copy,line);
show(pfun,copy);
}
puts("Enter a string (empty line to quit):");
}
puts("Bye!");
return 0;
}
char showmenu(void)
{
char ans;
puts("Enter nemu choice:");
puts("u) upper case l) lower case");
puts("t) transposed case o) original case");
puts("n) next string");
ans=getchar();
ans=tolower(ans);
eatline();
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(void(* fp)(char *),char * str)
{
(*fp)(str);
puts(str);
}







