标题:关于使用指针函数的例子《C Primer Plus》p431
只看楼主
Dream_weaver
Rank: 1
等 级:新手上路
帖 子:37
专家分:2
注 册:2012-6-8
结帖率:100%
已结贴  问题点数:20 回复次数:3 
关于使用指针函数的例子《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);
}

搜索更多相关主题的帖子: void 断点 include 知识 
2012-09-20 21:40
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:20 
试试gdb调试工具吧

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-09-23 20:12
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:0 
while((choice=showmenu()) != 'n');  这个后面的分号要去掉,否则循环体不执行
另外你的自定义函数不要跟库函数一个名字吧,改成to_upper和to_lower

[ 本帖最后由 pauljames 于 2012-9-23 21:15 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-09-23 20:54
cbliang
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2013-3-28
得分:0 
看看啊····
2013-03-28 16:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-381776-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057295 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved