2010년 1월 28일 목요일

함수 포인터를 활용한 메뉴처리(소스)

#include <stdio.h>
#include <string.h>
#include <ctype.h>
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[81];
   char copy[81];
   char choice;언
   void(*pfun)(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 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)
   {
      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);
}

댓글 없음:

댓글 쓰기