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;
}
|
함수에서 반환 받을 수 있는 값은 하나이기 때문에 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] = {1, 2, 3, 4, 5};
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;
}
|
'PRACTICE > Basic' 카테고리의 다른 글
[Arduino] 간단한 프린트문, 8개의 LED를 비트단위로 ON/OFF 하기 (0) | 2020.08.18 |
---|---|
[C] 포인터와 함수를 이용해서 배열 전체값, 평균값, 최대값 출력하기 (0) | 2020.07.16 |
[C] 배열을 포인터로 받는 함수 만들기 - 합계, 곱하기, 출력 (0) | 2020.07.16 |
[C] 0~99까지 난수를 생성하고 10단위 분포도 출력하기 (0) | 2020.07.16 |
[C] 이중 for문, if문을 활용한 별찍기 (0) | 2020.07.16 |
댓글