C string 함수 구현

2 minute read


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;
}


string_func

코드를 작성할 때는 가독성을 위해서 기능들을 파일마다 구분시켜놓는게 좋다.

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을 해준만큼 반복한다.
    하지만 대입할 변수의 크기가 복사할 문자열 크기보다 작으면 에러가 발생하기 때문에 더 큰 공간으로 할당해야한다.