第 14 章 结构和其他数据形式(函数指针)

  1 /*------------------------------
  2     func_ptr.c -- 使用函数指针
  3 ------------------------------*/
  4 
  5 #include <stdio.h>
  6 #include <string.h>
  7 #include <ctype.h>
  8 
  9 #define LEN 81
 10 
 11 char* s_gets(char *st, int n);
 12 char showmenu(void);
 13 void eatline(void);            //读取至行末尾
 14 void ToUpper(char*);        //把字符串转换为大写
 15 void ToLower(char*);        //把字符串转换为小写
 16 void Transpose(char*);        //大小写转换
 17 void Dummy(char*);            //不更改字符串
 18 void show(void (*fp)(char*), char *str);
 19 
 20 
 21 int main()
 22 {
 23     char line[LEN], copy[LEN];
 24     char choice;
 25     void (*pfn)(char*);        //声明函数指针
 26 
 27     puts("Enter a string (empty line to quit):");
 28 
 29     while (s_gets(line, LEN) != NULL && line[0] != '\0')
 30     {
 31         while ((choice = showmenu()) != '\n')
 32         {
 33             switch (choice)
 34             {
 35             case 'u': pfn = ToUpper;    break;
 36             case 'l': pfn = ToLower;    break;
 37             case 't': pfn = Transpose;    break;
 38             case 'o': pfn = Dummy;        break;
 39             }
 40 
 41             strcpy(copy, line);        //为 show() 函数拷贝一份
 42             show(pfn, copy);        //根据用户选择,使用选定的函数
 43         }
 44 
 45         puts("Enter a string (empty line to quit):");
 46     }
 47 
 48     puts("Bye!");
 49 
 50     return 0;
 51 }
 52 
 53 char showmenu()
 54 {
 55     char ans;
 56 
 57     puts("Enter menu choice:");
 58     puts("u) uppercase         1) lowercase");
 59     puts("t) transposed case o) original case");
 60     puts("n) next string");
 61 
 62     ans = tolower(fgetc(stdin));    //获取用户输入,转换为小写
 63     eatline();                        //清理输入行
 64 
 65     while (strchr("ulton", ans) == NULL)
 66     {
 67         puts("Please enter a u, l, t, o, or n:");
 68         ans = tolower(fgetc(stdin));
 69         eatline();
 70     }
 71 
 72     return ans;
 73 }
 74 
 75 void eatline(void)
 76 {
 77     while (fgetc(stdin) != '\n') continue;
 78 }
 79 
 80 void ToUpper(char *str)
 81 {
 82     while (*str)
 83     {
 84         *str = toupper(*str);
 85         ++str;
 86     }
 87 }
 88 
 89 void ToLower(char *str)
 90 {
 91     while (*str)
 92     {
 93         *str = tolower(*str);
 94         ++str;
 95     }
 96 }
 97 
 98 void Transpose(char *str)
 99 {
100     while (*str)
101     {
102         if (islower(*str))
103             *str = toupper(*str);
104         else if (isupper(*str))
105             *str = tolower(*str);
106 
107         ++str;
108     }
109 }
110 
111 void Dummy(char *str)
112 {
113     //do nothing
114 }
115 
116 void show(void (*fp)(char*), char *str)
117 {
118     (*fp)(str);        //把用户选定的函数作用于str
119     puts(str);        //显示结果
120 }
121 
122 char* s_gets(char *st, int n)
123 {
124     char *ret_val, *find;
125 
126     if (ret_val = fgets(st, n, stdin))
127     {
128         if (find = strchr(st, '\n'))
129             *find = '\0';
130         else
131             while (fgetc(stdin) != '\n') continue;
132     }
133 
134     return ret_val;
135 }
func_ptr.c

posted @ 2018-06-15 10:10  web1013  阅读(174)  评论(1编辑  收藏  举报