몽상실현개발주의

[따배씨] 4.26 함수 포인터의 배열 연습문제 본문

Language/C

[따배씨] 4.26 함수 포인터의 배열 연습문제

migrationArc 2021. 7. 14. 23:53

[따배씨] 4.26 함수 포인터의 배열 연습문제

따배씨 - 따라하며 배우는 C언어

14강 구조체_2

4.26 함수 포인터의 배열 연습문제

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

void update_string(char* str, int(*pf)(int));
void ToUpper(char* str);
void ToLower(char* str);
void Transpose(char* str);

int main()
{
    char options[] = {'u', 'l', 't'};
    int n = sizeof(options) / sizeof(char);
    
    typedef void (*FUNC_TYPE)(char*);
    FUNC_TYPE operations[] = {ToUpper, ToLower, Transpose};
    
    printf("Enter a string\n>> ");
    
    char input[100];
    
    while (scanf("%[^\n]%*c", input) != 1)
        printf("Please try again.\n>> ");
    
    while (true)
    {
        printf("Choose an option:\n");
        printf("u) to Upper\n");
        printf("l) to Lower\n");
        printf("t) to Transpose\n");
        
        char c;
        while (scanf("%c%*[^\n]%*c", &c) != 1)
            printf("Please try again.\n>> ");
        
        bool found = false;
        
        for (int i = 0; i < n; i++)
        {
            if (options[i] == c)
            {
                (*(operations[i]))(input);
                found = true;
                break;
            }
        }
        
        if (found)
            break;
        else
            printf("Wrong input, try again\n");
        
    }
    
    printf("%s\n", input);
    
    return 0;
}

void update_string(char* str, int(*pf)(int))
{
    while (*str)
    {
        *str = (*pf)(*str);
        str++;
    }
}


void ToUpper(char* str)
{
    update_string(str, toupper);
}

void ToLower(char* str)
{
    update_string(str, tolower);
}

void Transpose(char* str)
{
    while (*str)
    {
        if (islower(*str))
            * str = toupper(*str);
        else if (isupper(*str))
            *str = tolower(*str);
        str++;
    }
}
char options[] = {'u', 'l', 't'};
int n = sizeof(options) / sizeof(char);

typedef void (*FUNC_TYPE)(char*);
FUNC_TYPE operations[] = {ToUpper, ToLower, Transpose};

//////////////////

for (int i = 0; i < n; i++)
{
  if (options[i] == c)
  {
    (*(operations[i]))(input);
    found = true;
    break;
  }
}
  • 함수 포인터의 배열을 활용하여, 메뉴 선택 구현
  • 확장성 있는 코드 패턴

 

scanf("%c%*[^\n]%*c", &c)
  • % 뒤의 * 은 입력받고 무시한다는 의미
  • '[]' 안의 문자가 아닌 문자를 만났을때 까지 입력 받음
  • '[^]' 안의 문자를 만났을때 까지 입력 받음
  • -> char 하나를 입력 받음 & \n 을 만날때까지 입력 받지만 무시 & 그뒤 입력 무시

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments