본문 바로가기
PRACTICE/Basic

[C] 문자데이터를 입력받고 대문자는 소문자로, 소문자는 대문자로 변환하는 프로그램

by 1005 2020. 7. 16.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
 
int lower(char* str, int count);  // 대문자를 소문자로 변경하는 함수
int upper(char* str, int count);  // 소문자를 대문자로 변경하는 함수
int main() {
 
    char str[100];                             // 입력 받을 문자 저장.
    int choice;
    int count = 0;                             // 바뀐 문자 수 저장.
    int size = sizeof(str) / sizeof(str[0]);   // 배열의 사이즈 저장.
 
    printf("문자 입력: ");
    gets(str);
    printf("\n");
 
    printf("문자를 어떻게 변경할까요? \n");
    printf("1. 대문자 → 소문자 \n");
    printf("2. 소문자 → 대문자 \n");
    printf("3. 대문자 → 소문자, 소문자 → 대문자 \n");
    scanf_s("%d"&choice);
    printf("\n");
 
    switch (choice) {
    case 1:
        for (int i = 0; i < size; i++) {            // 배열 인덱스만큼 반복
            if (str[i] == '\0'break;              // 문장이 끝났으면 반복문 종료.
            if (str[i] >= 'A' && str[i] <= 'Z') {   // 배열에 저장된 값이 대문자일때 
                count = lower(str + i, count);      // 배열주소, count를 lower함수에 넘겨주고 
                                                    // 반환받은 count값을 count에 대입.
            }
        }
        break;
    case 2:
        for (int i = 0; i < size; i++) {
            if (str[i] == '\0'break;
            if (str[i] >= 'a' && str[i] <= 'z') {    // 배열에 저장된 값이 소문자일때
                count = upper(str + i, count);       // 배열주소, count를 upper함수에 넘겨주고 
                                                     // 반환받은 count값을 count에 대입.
            }
        }
        break;
    case 3:
        for (int i = 0; i < size; i++) {
            if (str[i] == '\0'break;
            if (str[i] >= 'A' && str[i] <= 'Z') {
                count = lower(str + i, count);  // str + i == str[i] ,
                                                // 즉 lower함수에 str[i]의 주소값을 넘겨줌.
            }
            else if (str[i] >= 'a' && str[i] <= 'z') {
                count = upper(str + i, count);
            }
        }
        break;
    default:
        printf("선택지를 잘못 입력하셨습니다. \n");
        return 0//선택지를 잘못 입력하면 바로 프로그램 종료.
    }
 
    printf("바뀐 문장: %s \n", str);
    printf("바뀐 문자 수: %d \n", count);
 
    return 0;
}
int lower(char* str, int count) {  // 배열에 첫주소에 index값을 더하면 원하는 배열의 인덱스 주소를 찾을 수 있다. 
    *str += ('a' - 'A');           // str은 배열주소, *str 배열주소에 저장된 값              
    count++;                       // 대문자 하나를 소문자로 변경했기 때문에 
                                   // 변경된 문자수를 count하는 count변수의 값을 1 증가시킴.
 
    return count;
}
int upper(char* str, int count) {
    *str -= ('a' - 'A');            // 'a'가 'A'보다 아스키코드값이 크기 때문에 'a' 에서 'A'를 빼줌.  
                                    // 97-65 = 32
    count++;
 
    return count;
}

 

1. 모두 소문자로 출력

 

2. 모두 대문자로 출력

 

3. 대문자는 소문자로, 소문자는 대문자로 바꿔 출력

 

함수에서 반환 받을 수 있는 값은 하나이기 때문에 count값을 리턴해줬고,

배열값은 포인터를 이용해서 함수 내에서 변경될 때마다 바로 수정해주었다.

count도 return 받지 않고 바로 함수 내에서 변경하고 싶을 시 위의 코드 중 일부를 아래와 같이 변경하면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//기존 코드
int lower(char *str, int count);  
int upper(char *str, int count);  
//리턴을 받지않기 때문에 반환형을 void로 변경함.
void lower(char *str, int *count);  
void upper(char *str, int *count);  
 
 
 
//기존 코드
count = lower(str + i, count);
count = upper(str + i, count);
//반환값이 없기때문에 대입하는 수식을 삭제하고 함수호출만 함. (반환값이 없으면 수식을 쓸 수 없음.)
lower(str + i, &count); //count변수의 주소값을 보내주기 위해 주소참조연산자(&)를 사용함.
upper(str + i, &count);
 
 
 
//기존 코드
int lower(char *str, int count) {  
    *str += ('a' - 'A');                    
    count++;  
 
    return count;
}
int upper(char *str, int count) {
    *str -= ('a' - 'A');            
    count++;
 
    return count;
}
//반환형을 void로 변경하고 count도 값을 참조할 수 있게 포인터를 붙임. count = 주소, *count는 주소에 저장된 값.
void lower(char *str, int count) {  
    *str += ('a' - 'A');                    
    (*count)++;  //증감연산자보다 연산 우선순위를 높이려고 ()를 사용함.
 
    return count;
}
void upper(char *str, int count) {
    *str -= ('a' - 'A');                          
    (*count)++
 
    return count;
}

 

 

포인터를 배열처럼 사용하는 경우 코드는 아래와 같이 변경된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//개념설명
int arr[5= {12345};
int *parr;
parr = aa;
// *(parr + 0) == parr[0] == arr[0] == 1
// *(parr + 4) == parr[4] == arr[4] == 5
 
 
//기존 코드
int lower(char *str, int count);  
int upper(char *str, int count);  
//배열의 인덱스를 넘겨주는 인자 생성
int lower(char *pstr, int count, int index);
int upper(char *pstr, int count, int index);  
 
 
 
//기존 코드
char str[100];        
int choice;
int count = 0;         
//배열의 주소를 저장하는 포인터변수를 생성함. 
char str[100];
char *pstr = str; //str배열의 주소를 포인터변수에 저장함.        
int choice;
int count = 0;  
 
 
 
//기존 코드
count = lower(str + i, count);
count = upper(str + i, count);
//수정 코드
//str은 str배열의 시작 주소를 의미함, pstr은 str의 주소를 저장했으니 str배열의 시작 주소가 저장되어 있음.
count = lower(pstr, count, i);
count = upper(pstr, count, i);
 
 
 
//기존 코드
int lower(char *str, int count) {  
    *str += ('a' - 'A');                    
    count++;  
 
    return count;
}
int upper(char *str, int count) {
    *str -= ('a' - 'A');            
    count++;
 
    return count;
}
//포인터 변수를 배열처럼 사용함.
int lower(char *pstr, int count, int index) {//str배열의 시작주소값, 바꾸고 값이 저장된 str배열의 인덱스값도 받아옴.
    pstr[index] += ('a' - 'A');            //*(pstr + index) == pstr[index] == str[index]      
    count++;  
 
    return count;
}
int upper(char *pstr, int count, int index) {
    pstr[index] -= ('a' - 'A');            
    count++;
 
    return count;
}

 

 

댓글