strcat 뜯어보기
strcat(char *_Destination, const char *_Source)
cat은 concatenate 라는 단어에서 따왔다. 사슬같이 잇다; 연쇄시키다; 결부[연결]시키다, 연관시키다 라는 뜻이 있다.
strncat 뜯어보기
strncat(char *_Destination, const char *_Source, size_t _Count)
strlen 뜯어보기
strlen(const char *_Str)
함수의 반환값은 size_t __cdecl 자료형을 가지고 있는데 뜯어보면 unsigned long long 이다.
문자열은 정수형태로 표시 되기 때문에 그냥 정수형이라고 보면 된다.
예제로 알아보는 사용
#include<stdio.h>
#include<string.h>
int main()
{
char str[80] = "straw";
strcat(str, "berry");
printf("%s\n", str);
strncat(str, "piece", 3);
printf("%s\n", str);
return 0;
}
주의할점 2가지
1. 배열의 크기가 충분히 크지 않다면
아래와 같은 런타임에러가 발생한다.
Run-Time Check Failure #2 - Stack around the variable 'str' was corrupted.
2. 뒤에 이어붙이는 녀석이기 때문에 Destination 이 되는 배열이 초기화 되어있지 않다면 오류가 발생합니다.
Destination이 되는 char배열에서 NULL 값부터 찾아 뒤에 넣는 방식으로 동작 하기 때문에
NULL 을 못찾는다면 쓰레기값의 중간부터 붙여넣을 가능성이 큽니다.
#include<stdio.h>
#include<string.h>
int main()
{
char str[6];
strncat(str, "piece", 3);
printf("%s\n", str);
return 0;
}
요걸 실행 해보면
이렇게 쓰레기 값이 출력된다.
직접 만들어보는 strcat 함수
#include<stdio.h>
#include<string.h>
char *my_strcat(char* pd, char* ps)
{
char* po = pd;
while (*pd != '\0')
{
pd++;
}
while (*ps != '\0')
{
*pd = *ps;
pd++;
ps++;
}
*pd = '\0';
return po;
}
int main()
{
char str[30] = "banana";
my_strcat(str, "milk");
fputs(str, stdout);
}
처음 함수에 접근하면 매개변수로 받은 포인터 변수를 참조하도록 포인터 변수를 하나 더 만든다.
이 po라는 char포인터는 문자열의 첫번째 주소를 의미하는데, 왜 이녀석을 만들었냐면 매개변수 pd를 가지고서 연산이 이루어지기 때문에 끝에 가면 pd는 저~ 뒤로 가있게 된다. 그래서 모든 연산이 끝나고 나서 return 값으로 po만 반환하면
문자열의 첫번째 주소만 반환하는것이기 때문에 결과적으로 문자열의 첫번째 주소와, NULL만 있으면 문자열을 출력하는데에 전혀 문제가 없게 된다.
while문의 조건에 포인터 연산을 시키는 점이 처음 내가 보는 알고리즘이라 흥미롭다.
while(pd != '\0') 문장에 따라 자동으로 NULL을 만날때 까지 연산을 하게 되는데
이제 NULL을 만날 때 까지 연산 한다는것은 문자열이 끝날때 까지 연산 한다는 것이다.
첫번째 while문이 종료됨과 동시에 pd의 주소는 NULL 주소에 있게 된다.
이제 두번째 while문이 시작 되고 두번재 매개변수인 ps의 문자열을 한글자씩 훑으면서 반복문이 진행된다.
pd의 끝인 NULL 주소의 값에 ps를 대입하는것을 시작으로 한글자씩 ps의 값이 pd로 복사된다.
두번째 while문이 끝나면 마지막 주소를 NULL로 변경 해주고 시작 주소인 po를 반환하면 끝이다.
예제로 알아보는strlen 사용
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[80], str2[80];
char* resp;
printf("2개의 과일 이름 입력 : ");
scanf("%s%s", str1, str2);
if (strlen(str1) > strlen(str2))
resp = str1;
else if (strlen(str1) == strlen(str2))
{
printf("이름의 길이가 같습니다.");
return 0;
}
else
resp = str2;
printf("이름이 긴 과일은 : %s\n", resp);
return 0;
}
두 문자열의 길이를 비교해주는 것을 알 수 있다.
직접 만들어보는 strlen 함수
#include<stdio.h>
#include<string.h>
int my_strlen(char* ps)
{
int cnt = 0;
while (*ps != '\0')
{
cnt++; //문자 수 증가 1글자당 1씩 증가하게 됨
ps++; //포인터를 이동시킴 루프카운터 조건이기도 함.
}
return cnt; // 전체 문자 수 반환
}
int main()
{
char ch[50] = "MyProgram";
printf("%d", my_strlen(ch));
}
strlen을 만드는 과정을 while문으로 구현해 보았다.
역시 포인터 연산으로 한 주소씩 증가시키면서 NULL을 만나기 전까지 루프가 실행된다.
0부터 루프1회마다 cnt에 1이 누적되기 때문에 NULL을 만나기 전까지 계산하면 딱 NULL을 제외한 문자열 길이 값이 반환된다.
'C언어 자습 > 혼자공부하는 C언어 (저자 서현우)' 카테고리의 다른 글
정적 지역 변수static, 레지스터 변수register (0) | 2023.04.24 |
---|---|
문자열 연산함수(3) 문자열을 비교하는 strcmp, strncmp함수 (0) | 2023.04.21 |
문자열 연산 함수 strcpy, strncpy (0) | 2023.04.20 |
gets 함수를 사용한 문자열 입력(gets, fgets) (0) | 2023.04.20 |
문자열의 마지막에 NULL이 존재하는 이유 (0) | 2023.04.20 |