강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.6 다양한 문자열 함수들

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

해결된 질문

작성

·

22

1

void fit_str(char* str, unsigned int loc)
{
	str[loc] = '\0';

	for (; loc < strlen(str) ; loc++) str[loc] = '\0';

}
int my_strcmp(char* str1, char* str2)
{
	char* str1_ptr = str1;
	char* str2_ptr = str2;

	if (strlen(str1_ptr) > strlen(str2_ptr))
		return 1;
	if (strlen(str1_ptr) < strlen(str2_ptr))
		return -1;
	if (strlen(str1_ptr) == strlen(str2_ptr))
	{
		int i = 0;
		while (i < strlen(str1_ptr))
		{
			if ((char)str1_ptr[i] - (char)str2_ptr[i] > 0)
				return -1;
			else if ((char)str1_ptr[i] - (char)str2_ptr[i] < 0)
				return 1;
			i++;
		}
		return 0;
	}
}
int my_strncmp(char* str1, char* str2, unsigned int loc)
{
		int compare = 0;
		char st1[sizeof(str1)] = { 0, };
		char st2[sizeof(str2)] = { 0, };
		for (int i = 0; i < strlen(str1); i++)
			st1[i] = str1[i];
		for (int i = 0; i < strlen(str2); i++)
			st2[i] = str2[i];

		fit_str(st1, loc);
		fit_str(st2, loc);

		compare = my_strcmp(st1, st2);

		return compare;


}

답변 2

0

안녕하세요? 질문&답변 도우미 durams입니다.

my_strcmp

두 문자열의 길이를 먼저 비교하고 길이가 같을 때에만 반복문을 통해 비교하도록 구현하셨는데요, 이는 사실 strcmp의 동작과는 조금 다릅니다. strcmp는 순수하게 사전순(Lexicographical)으로 비교를 하기 때문에, 길이가 다르다고 해서 바로 결정이 나지는 않습니다. 한 글자씩 비교하다가 한 쪽에 널 문자가 등장하는 경우 널 문자는 값이 0이기 때문에 자동으로 사전순으로 맨 앞에 위치하는 것이 되는 식으로 비교가 이루어지죠. 물론 널 문자를 만나면 종료도 이루어져야 합니다.

또한 반환값을 결정하는 로직이 혼재되어있는 것 같습니다. C 표준 함수 strcmp는 첫 번째 문자열이 사전순으로 빠르다면 음수(-1)을, 두 번째 문자열이 사전순으로 빠르다면 양수(1)을 반환합니다. 하지만 반복문을 통해 비교하는 부분에서는 그와 반대로 반환하는 것으로 보입니다.

my_strncmp

인자로 전달받은 문자열을 복사한 다음 길이를 맞추고 비교를 하는 것을 보이는데요, 여기도 오류가 있습니다. sizeof() 연산자가 받는 str1str2배열이 아닌 포인터이기 때문에, 문자열의 길이와 관계없이 x86으로 빌드했다면 4, x64로 빌드했다면 8을 반환하게 됩니다. 실제 문자열의 길이를 얻고 싶다면 strlen을 사용하거나 다른 방법을 사용하셔야 합니다.

또한 복사나 fit_str을 하는 전처리를 할 필요없이 바로 비교를 할 수도 있습니다. 물론 str1str2loc보다 작은 경우를 판별하는 등의 예외 처리는 필요합니다.

0

안녕하세요, 인프런 AI 인턴입니다. wjdwn535님.

작성하신 코드를 보니 strcmpstrncmp 함수를 직접 구현하려고 시도하신 것 같습니다. 여기서 구현한 my_strcmpmy_strncmp 함수는 C 라이브러리 함수인 strcmpstrncmp의 기능을 모방하려는 목적으로 보입니다.

요약 및 설명:

  1. fit_str 함수:

    • 이 함수는 문자열의 지정된 위치 이후의 모든 문자를 \0으로 설정합니다.
    • 예를 들어, fit_str("Hello", 2)는 “He\0\0\0”로 문자열을 변경합니다.
  2. my_strcmp 함수:

    • 두 문자열의 길이를 먼저 비교하고, 길이가 동일하면 각 문자를 차례대로 비교하여 차이를 반환합니다.
    • 구현 상 부족한 점: 동일한 문자열 비교 시 0을 반환하는 것이 표준적입니다. 현재 비교 로직의 부호 처리가 strcmp와 반대입니다.
  3. my_strncmp 함수:

    • fit_str 함수를 사용하여 특정 길이만큼만 비교하도록 하였습니다.
    • 새로운 배열 st1st2가 각각의 문자열을 복사하여 비교하는 구조입니다.
    • 문제점: sizeof(str1)sizeof(str2)는 포인터 크기를 반환하므로, 동적으로 문자열 크기를 계산하여 할당해야 합니다.

추가 참고 자료

코드가 잘 작동하지 않을 경우, 다음과 같은 링크가 도움이 될 수 있습니다:
- 직접 구현해본 implement_my_strcat/strcmp 입니다.
- str3를 출력하던중 생긴 오류와 궁금증

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjdwn535님의 프로필 이미지
wjdwn535

작성한 질문수

질문하기