프로젝트 & 과제/3학년

[C언어] 문자열 배열의 순서를 바꾸는 함수

qqlzzb 2022. 2. 7. 19:05

개요

프로그래밍 언어 : 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]이 출력되지 않음을 알 수 있다.