새소식

컴퓨터공학 💻/C

[ C언어 ] - 문자열 관련 함수를 직접 구현하기

  • -

 

일반적으로 어떤 변수를 출력할 때 그것은 해당 변수가 위치한 주소의 값을 출력하는 것이다.

위와 같이 a라는 것은 변수Ko가 가지고 있는 '값' 이며, a가 위치한 주소는 별도의 메모리 주소를 가지고 있는 것이다.

이러한 점에서 Ko == *&Ko 와 같은 뜻이라고 볼 수 있다.

 

 

array 변수 자체는 array의 시작점 주소를 가지고 있다. 주소값을 출력해보면 Ko, &Ko[0], *&Ko 가 모두 같은 결과를 출력하는 것을 볼 수 있다. 변수 Ko 자체가 시작점 주소를 가지고 있으므로 &Ko[0]와 동일한 의미인 것이다.

&와 *가 함께 있으면 서로 교차캔슬되어 *&Ko 와 Ko가 동일한 의미가 된다.

즉 *Ko == Ko[0] 이며 Ko[1]이 되기 위해서는 *(Ko + 1)로 표현 가능하다.

 

 

 

strlen() 구현

 

변수와 반복문을 이용해 코드는 길어지지만 strlen() 함수를 구현할 수 있다. 

우선 문자열의 시작점을 선언하는 char* ap를 하나 만들고 string array 변수 a의 시작점을 받도록 한다. 

 

그다음 변수 ap가 string array 값의 길이를 count할 수 있도록 반복문 while을 이용해 *ap가 Null 값이 아닐때의 조건을 설정해 반복문에 들어가게 한다. 반복문에 들어갈 때 마다 count가 증가하며 ap도 증가, 즉 주소값이 1씩 증가하여 인덱스가 증가하면서 길이를 계속해서 측정하는 것이다. 

 

반복문이 끝나고 count가 문자 개수를 센 만큼이 결과로 나오게 된다.

 

 

 

strcat() 구현

 

strcpy() 함수를 이용해 strcat() 함수를 구현할 수 있다.

strcpy로 두 개의 변수를 받고 현재 str1의 시작점 주소에서 str1의 길이를 더한 만큼의 주소를 하나의 변수로 저장(str1의 주소가 101이라고 가정했을 때 str1의 길이는 10이므로 더하면 111의 주소를 가지게 된다), 그리고 str2를, 더한 주소의 위치에 붙여넣으면 str1(a)과 str2(b)가 나란히 붙여져 출력되는 것이다.

 

만약 strcpy() 함수를 쓸 수 없는 상황이라면 다음과 같은 순서의 방법을 사용해야 한다.

1. 첫번째 string의 맨 끝 부분의 주소를 찾은 후  2. 그 주소의 위치부터 두번째 string을 copy 한다. strcpy를 사용할 수 없다면 한글자 한글자씩 복사해주어야 한다.

 

str1, str2 변수를 받고 메모리 주소를 이리저리 옮겨다닐 수 있는 int형 변수 car1과 car2를 이용해 해당 위치의 한글자씩 복사하며 strcat() 함수를 구현하는 원리이다. 

 

먼저 str1의 끝지점을 알아야 한다. car1은 str1의 시작점 주소로부터 최초값 0부터 시작하여 null값을 볼때까지 1씩 주소를 증가시켜 움직인다. null값을 만난 후 종료되는데 그 지점이 str1의 끝지점으로 볼 수 있다. car1은 현재 str1의 끝지점에 위치해 있다.

 

다음으로 car2를 움직인다. car2는 car1의 위치에서부터 이동한다. +1씩 이동하면서 car2가 매 위치하는 곳의 값(A..p..p..l..)을 왼쪽항에 복사한다. null값을 만날때까지 모든 str2 문자열을 복사한 후 종료하게 된다.

 

car2가 마지막으로 위치한 곳이 null값인데 이 위치 역시 복사되었으므로 그 위치에 추가로 null값을 선언한다.

return 값으로 str1의 시작점 주소를 출력하면 a와 b의 문자열이 붙여진 것을 볼 수 있다.

 

 

 

strcmp() 구현

 

 

str1과 str2 포인터변수를 받고 str1과 str2의 현재의 값이 같을 때의 조건으로 반복문을 돌린다. 그 사이에 어느 한 str이 null에 도달하면 즉시 반복문을 멈추게 하는 조건을 추가한다. 만약 두 string 중 어느 하나가 먼저 null에 도달한다면 두 string의 값이 다르다는 것으로 같지 않다는 의미이다.

 

str1과 str2가 모두 null 값이라는 조건에서 0을 return하고 그렇지않으면 1을 return하도록 한다.

메인함수에서 virStrcmp 함수를 불러와서 a와 b에 적용하여 a와 b의 문자열이 같다면 a == b, 같지 않다면 a != b를 출력하도록 한다.

'컴퓨터공학 💻 > C' 카테고리의 다른 글

[ C언어 ] - 구조체 struct  (0) 2020.09.19
[ C언어 ] - 다차원 배열의 생성과 선언  (0) 2020.09.03
[ C언어 ] - 문자열 관련 함수  (0) 2020.08.22
[ C언어 ] - scanf()  (0) 2020.08.21
[ C언어 ] - 포인터  (0) 2020.08.21
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.