
쉘의 입력 값을 아스키 코드 입력값 순서로 변환하는 작업을 하고 있다. 그런데, 위에서 볼 수 있듯이 adsk는 aasjw 뒤에 위치해야하나 맨 뒤에있다. 보면 첫번째 문자를 주로 스와핑이 되었음을 확인 할 수 있다. 어디에서는 스와핑이 되고 또 어디에서는 되지 않는다.이에 대한 문제 해결 결과로 투 포인터 스와핑이 문제라는 것을 알았다.
아래 그 개념을 살펴보고 투 포인터를 사용할 때 유의점을 기억하자.
문자열을 다룰 때, 문자열의 실제 데이터는 메모리에 배열 형태로 저장된다. 예를 들어, 문자열 "hello"는 메모리에서 다음과 같이 저장될 것이다:
메모리 주소: | 'h' | 'e' | 'l' | 'l' | 'o' | '\0' |
여기서 포인터는 이러한 문자열 배열의 시작 주소를 가리키게 된다. 즉, 포인터는 문자열의 첫 번째 문자를 가리키는 주소를 저장하고 있다. 문자열 포인터를 사용하면 문자열 데이터의 위치를 조작하거나 접근할 수 있게 된다.
문자열을 정렬할 때는 문자열 포인터를 스와핑해야 한다. 이는 문자열 배열에서 문자열의 위치를 바꾸기 위함이다. 실제 문자열 데이터는 변경하지 않고, 문자열 포인터의 위치만 변경하는 것이다.
ft_swap 함수)void ft_swap(char **a, char **b)
{
char *temp = *a; // 포인터 *a가 가리키는 문자열 주소를 temp에 저장한다.
*a = *b; // 포인터 *a를 포인터 *b가 가리키는 주소로 변경한다.
*b = temp; // 포인터 *b를 temp가 가리키는 주소로 변경한다.
}
이 함수는 char **a와 char **b를 인수로 받아 두 포인터의 값을 스와핑한다. 여기서 char **a와 char **b는 각각 문자열 포인터를 가리키는 포인터이다.
*a와 *b는 실제 문자열 포인터로, 포인터가 가리키는 문자열의 주소를 의미한다.temp는 스와핑을 위해 임시로 포인터 값을 저장하게 된다.*a와 *b의 값을 교환함으로써 두 문자열의 위치가 바뀌게 된다.문자열 포인터 배열에서 문자열의 순서를 바꾸기 위해서는 문자열 포인터를 교환해야 한다. 이는 ft_swap 함수에서 수행되며, 포인터를 교환하면 배열의 문자열 순서가 변경된다.
void ft_swap(char *a, char *b)
{
char temp;
temp = *a; // 문자 a의 첫 번째 문자를 temp에 저장한다.
*a = *b; // 문자 a의 첫 번째 문자를 문자 b의 첫 번째 문자로 변경한다.
*b = temp; // 문자 b의 첫 번째 문자를 temp로 변경한다.
}
이 함수는 문자열 데이터의 첫 번째 문자만을 스와핑하게 된다. 이는 문자열 배열에서 문자열의 위치를 바꾸는 데 필요한 작업이 아니다. 문자열 포인터를 교환해야만 문자열의 위치가 올바르게 변경되게 된다.
문자열 배열에서 문자열의 순서를 바꾸려면 문자열 포인터를 스와핑해야 한다. 문자열 데이터 자체를 스와핑하는 것이 아니라 포인터를 스와핑함으로써 문자열의 순서를 변경하게 된다.
다음과 같은 문자열 배열이 있다고 가정하자:
char *arr[] = {"apple", "banana", "cherry"};
여기서 arr[0]은 "apple"을 가리키고, arr[1]은 "banana"를 가리키며, arr[2]는 "cherry"를 가리킨다. 만약 "apple"과 "banana"를 교환하려면 arr[0]과 arr[1]의 포인터 값을 교환하게 된다. 이렇게 하면 배열의 순서가 변경될 것이다.
포인터 스와핑을 올바르게 이해하면 문자열 정렬과 같은 작업에서 효과적으로 문자열의 순서를 조작할 수 있게 된다.

변경후 결과를 보면 잘 변경 되었음을 알 수 있따.