C string 함수 구현
string 자료형
C++에서는 문자열을 위한 자료형인 string이 존재하지만 C에서는 오직 문자를 사용하는 자료형인 char만 존재하고 문자열을 표현하기 위해서는 char배열을 사용한다.
C에서도 문자열을 쓸 때 유용한 라이브러리인 <string.h>가 있긴 하지만 char배열을 사용한 문자열 저장방식 때문에 제약이 있다.
임의로 구현해보는 string과 몇 개의 함수들
// Mystring.h
#pragma once
typedef char MyString[];
int Mystrlen(const char* _str);
bool Mystrcmp(const char* _str1, const char* _str2);
void Mystrcpy(char* _str1, const char* _str2);
// Mystring.cpp
#include "Mystring.h"
int Mystrlen(const char* _str)
{
int lenth = 0;
while (_str[lenth++]);
return lenth - 1;
}
bool Mystrcmp(const char* _str1, const char* _str2)
{
bool compare;
int length = Mystrlen(_str1);
for (int i = 0; i < length; i++)
{
if (_str1[i] != _str2[i])
{
compare = false;
return compare;
}
}
}
void Mystrcpy(char* _str1, const char* _str2)
{
int length = Mystrlen(_str2);
_str1[length];
for (int i = 0; i < length + 1; i++)
{
_str1[i] = _str2[i];
}
}
// main.cpp
#include <stdio.h>
#include "Mystring.h"
int main()
{
/*
string.h 함수 중
strlen 문자열 길이
strcmp 문자열 비교
strcpy 문자열 복사
*/
MyString str = "Hello World!";
printf("%s\n", str);
int length = Mystrlen(str);
printf("%d\n", length);
MyString str2 = "Hello";
MyString str3 = "Hello World!";
bool compare = Mystrcmp(str, str2);
bool compare2 = Mystrcmp(str, str3);
printf("str == str2 : %s\nstr == str3 : %s\n", compare > 0 ? "True" : "False", compare2 > 0 ? "True" : "False");
MyString str4 = "copy string.";
Mystrcpy(str4, str);
printf("str copy str4 = %s\n", str4);
return 0;
}
코드를 작성할 때는 가독성을 위해서 기능들을 파일마다 구분시켜놓는게 좋다.
Mystring.h는 내가 만들 함수들의 선언들을 모아놓고 Mystring.cpp파일에서 함수들의 내용을 만들어 준다. 이 때 헤더파일은 꼭 include 해준다.
이렇게 구분지어 작성하면 수정이나 에러를 찾기 편하다.
1. string 자료형
-
typedef는 형식을 정의해주는 기능을 한다. string 자료형을 임시적으로 만들기 위해서 char배열의 자료형 이름을 MyString으로 만드는데 사용했다.
-
우선 MyString으로 문자열을 만들면 선언시 길이에 맞춰서 배열의 크기가 결정되긴 하지만 그 크기를 수정할 수 없어 한계가 생겼다.
2. strlen 함수
- 문자열 길이를 반환하는 함수이다. while문의 조건에 문자열의 인덱스를 1씩 증가시키면서 값을 넣게 되면 마지막 널문자는 정수 0과 같기 때문에 반복문이 종료된다.
1씩 증가시킨 값으로 길이를 카운트 해서 그 값을 반환하여 길이를 얻어낸다. 널문자까지 길이가 포함되기 때문에 1을 빼준값을 반환한다.
3. strcmp
- 문자열을 비교하는 함수이다. 길이를 구하는 함수를 사용해 문자열의 길이를 구하고 비교할 문자열의 길이만큼 반복문을 진행하여 각 인덱스를 비교한다. bool 반환형은 true 또는 false를 반환한다.
4. strcpy
- 문자열을 복사하는 함수이다. 반복문을 통해 각 인덱스 값을 대입해주는데 이 때 마지막 널문자까지 넣어주어야 이상한 문자가 찍히는 에러가 발생하지 않기 때문에 길이에 + 1을 해준만큼 반복한다.
하지만 대입할 변수의 크기가 복사할 문자열 크기보다 작으면 에러가 발생하기 때문에 더 큰 공간으로 할당해야한다.