▸C언어/기본함수 및 구현식

string.h_strcmp, strcnmp_문자열 비교 (구현식 포함)

코데방 2019. 12. 5.
728x90

[ strcmp ]

  • 문자열 비교 (대소문자 구분)
  • 앞의 문자가 더 크면 1
  • 값이 같으면 0
  • 뒤의 문자가 더 크면 -1

[ strncmp ]

  • 지정한 갯수만큼만 앞에서부터 비교
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdaa";
	char str3[] = "abcdzz";
	char str4[] = "abcdef";

	printf("%d ", strcmp(str1, str2));		// 1 (앞의 문자가 더 큼)
	printf("%d ", strcmp(str1, str3));		// -1 (뒤의 문자가 더 큼)
	printf("%d ", strcmp(str1, str4));		// 0 (같음)

	printf("%d ", strncmp(str1, str2, 4));	// 0 (앞에서부터 4개 문자 같음)
}

 


 

구현식은 아래와 같습니다. 실제 코드는 아니고 직접 짜본 코드입니다.

[ strcmp 구현식]

#include <stdio.h>
int my_strcmp(char* str1, char* str2);

int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdaa";
	char str3[] = "abcdzz";
	char str4[] = "abcdef";
	
	printf("%d ", my_strcmp(str1, str2));		// 1 (앞의 문자가 더 큼)
	printf("%d ", my_strcmp(str1, str3));		// -1 (뒤의 문자가 더 큼)
	printf("%d ", my_strcmp(str1, str4));		// 0 (같음)

}

int my_strcmp(char* str1, char* str2)
{
	int i = 0;

	// 한쪽 문자열이 끝날 때까지 비교 수행
	while (str1[i] != '\0' || str2[i] != '\0') {
		
		// 문자 같으면 계속 비교
		if (str1[i] == str2[i]) {
	        i++;	
          	continue;
        }

		// 앞의 문자가 더 크면 1 리턴
		else if (str1[i] > str2[i])
			return 1;

		// 뒤의 문자가 더 크면 -1 리턴
		else if (str1[i] < str2[i])
			return -1;
		i++;
	}

	// 어느 한쪽 문자열이 끝났고 i - 1 까지 모두 같은 상태
	if (str1[i] == str2[i])		// str1[i] == str2[i] == '\0' 이라면 0 리턴
		return 0;
	else if (str1[i] != '\0')	// str1에 글자가 남아있으면 1 리턴
		return 1;
	else return -1;				// str2에 글자가 남아있으면 -1 리턴
}

 


 

[ strncmp 구현식 ]

#include <stdio.h>
#include <string.h>
int my_strncmp(char* str1, char* str2, int n);

int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdaa";
	char str3[] = "abcdzz";

	printf("%d ", strncmp(str1, str2, 3));			// 0
	printf("%d ", my_strncmp(str1, str2, 3));		// 0

	printf("%d ", strncmp(str1, str2, 10));			// 1
	printf("%d ", my_strncmp(str1, str2, 10));		// 1

	printf("%d ", strncmp(str1, str2, 5));			// 1
	printf("%d ", my_strncmp(str1, str2, 5));		// 1
	
	printf("%d ", strncmp(str1, str3, 5));			// -1
	printf("%d ", my_strncmp(str1, str3, 5));		// -1

	printf("%d ", strncmp(str1, str3, 4));			// 0
	printf("%d ", my_strncmp(str1, str3, 4));		// 0
}

int my_strncmp(char* str1, char* str2, int n)
{
	int i = 0;
	// 한쪽 문자열이 끝날 때까지 또는 n 보다 작을 때 비교 수행
	while (i < n && (str1[i] != '\0' || str2[i] != '\0')) {
		
		// 문자 같으면 계속 비교
		if (str1[i] == str2[i]) {
			i++;
			continue;
		}

		// 앞의 문자가 더 크면 1 리턴
		else if (str1[i] > str2[i])
			return 1;

		// 뒤의 문자가 더 크면 -1 리턴
		else if (str1[i] < str2[i])
			return -1;
		
		i++;
	}	

	// 어느 한쪽 문자열이 끝나거나 n 갯수만큼 비교한 후
	if (n == i)			// i == n이라면 찾는 갯수 안의 문자는 모두 같음, 0 리턴 
		return 0;

	else if (str1[i] == '\0' && str2[i] == '\0')	// 둘 다 문자열 끝났으면 0 리턴
		return 0;

	// 둘 중 하나라도 문자열 남아 있으면 비교
	else if (str1[i] > str2[i])	
		return 1;

	else return -1;
}
728x90

댓글

💲 추천 글