关于使用指针函数的例子《C Primer Plus》p431
《C Primer Plus》p431的例子,我原本看懂以后,自己变了一下,跟书上有些出入,编译无误,结果无法显示于是逐步对照书,改了一遍,编译无误,执行无法得到正确结果。
本来想设置断点试试的,但是这方面的知识薄弱,请大家指教。(另外大家可以推荐一下设置断点检错方面的书籍或者链接,谢谢。)
//14.16 func_ptr.c 使用函数指针进行大小写转换
#include<stdio.h>
#include<string.h>
#include<ctype.h> //这个函数包含toupper tolower大小写转换的函数
char showmenu( void);
void show(void (*ptr)(char *),char *str);
void toupper(char *str);
void tolower(char *str);
void dummy(char *str);
void transpose(char *str);
void eatline(void);
int main(void)
{
char line[80];
char copy[80];
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'); //当输入为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 next 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) transpose case o) original case");
puts("n) next string");
ans=getchar();
ans=tolower(ans);
eatline();
while(strchr("ulton",ans)==NULL)
{
puts("Enter u,l,t,o,n:");
ans=tolower(getchar());
eatline();
}
return ans;
}
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 eatline(void)
{
while(getchar() != '\n')
continue;
}
void show(void (*fp)(char *),char *str)
{
(*fp)(str); //fp(str)
puts(str);
}