개요
프로그래밍 언어 : C언어
과제 수행 날짜 : 2020.11.27
과제 개요 : main 함수 내에 있는 문자열 배열의 순서를 바꾸는 함수
코드
#include <stdio.h>
#define N 2
void change(char str[][100]);
int main()
{
char str[N][100] = { "banana","apple"};
change(str);
for (int j = 0; j < N; j++)
{
printf("%s ", str[j]);
}
}
void change(char str[][100])
{
for (int i = 0; i < N / 2; i++)
{
char tmp[100] = { 0, }; //tmp 초기화
int a = 0;
while (1) //앞쪽 문자열을 tmp 배열에 저장
{
tmp[a] = str[i][a];
a++;
if (str[i][a - 1] == 0) break;
}
a = 0;
while (1) //앞쪽 문자열에 반대편 문자열 복사
{
str[i][a] = str[N - i - 1][a];
a++;
if (str[N - i - 1][a - 1] == 0) break;
}
a = 0;
while (1) //반대편 문자열에 tmp 배열 복사
{
str[N - i - 1][a] = tmp[a];
a++;
if (tmp[a-1] == 0) break;
}
}
return;
}
결과
- 배열 안에 문자열이 10개인 경우의 결과
- 배열 안에 문자열이 5개인 경우의 결과
설명
N/2를 기준으로 앞쪽 문자열들을 tmp라는 배열에 복사해둔다. 왜냐하면 뒤쪽 문자열을 앞쪽에 복사하면 앞쪽 문자열들의 원본이 사라지기 때문에 뒤에 복사를 할 수 없기 때문이다.
앞쪽 문자열을 tmp에 전부 복사한 후에는 반대편에 있는 문자열을 해당 자리에 복사한다. 반대편 문자열의 null까지 복사해야 하므로 무한 반복문에서 if (str[N - i - 1][a - 1] == 0) break; 라는 조건을 통해 null까지 복사한 후, while문을 빠져나온다.
N.2 기준으로 뒤쪽에 있는 문자열에는 앞에서 복사해둔 tmp 배열을 복사해서 입력한다. 앞에서와 마찬가지로 앞쪽 문자열의 null까지 복사해야 하므로 무한 반복문에서 if (tmp[a-1] == 0) break;라는 조건을 통해 tmp 배열을 모두 복사해서 반대편 문자열에 복사한다.
main 함수에 있는 2차원 배열을 change 함수에서 2차원 배열과 똑같이 사용하려면 change 함수에서는 인수로 str 배열을 str[][100]으로 받아야 한다. 만약 인수로 *str[]나, **str의 형태로 받는다면 str[i][j]와 같은 형태를 사용할 수 없기 때문에 2차원 배열에 대한 포인터는 str[][100]과 같은 형태를 사용한다.
*str[]의 형태로 받은 경우 | **str의 형태로 받은 경우 | str[][100]의 형태로 받은 경우 |
위에서 확인할 수 있듯, str[][100]와 같이 함수에서 받는다면 change 함수에서도 실제 2차원 배열과 같이 사용할 수 있게 된다. 따라서 str[0][0]의 형태도 출력할 수 있는 반면, *str[]이나 **str과 같이 받는다면 2차원 배열과 같이 사용할 수 없어서 str[0][0]이 출력되지 않음을 알 수 있다.
'프로젝트 & 과제 > 3학년' 카테고리의 다른 글
[C언어] 구조체 출력 (0) | 2022.02.09 |
---|---|
[C언어] 문자열의 마지막 문자 변경 (0) | 2022.02.08 |
[C언어] 포인터로 값 복사 (0) | 2022.02.06 |
[C언어] 포인터로 문자열 복사 (0) | 2022.02.05 |
[C언어] call by value/reference (0) | 2022.02.04 |