cCcode

C Language [핵심정리] - 19 + ∂ 본문

C Language Basic

C Language [핵심정리] - 19 + ∂

cCcode 2021. 5. 29. 01:54

1. 문자열 비교하기 (상세)

문자열 비교

위 코드에서 이상한 점이 보이시나요? 바로 strcmp함수에서 s1부분경고를 나타내는 녹색줄표시되네요.

경고는 다음과 같습니다.

경고

해당 경고변수를 사용하기 전 메모리에 남아있는 쓰레기 값을 지우지 않고 그대로 사용할 때 자주 발생하는 경고입니다. 그러면 여기서 의문이 들겠죠? 나는 분명히 값을 할당하면서 그전 은 없어졌을 텐데, 왜 이런 경고가 뜨는것일까? 저도 이런 의문이 들어 한 가지의 가설을 세웠습니다.

 

"배열을 처음 선언해서 할당할 때는 중괄호를 사용하는 데, 중괄호사용하지 않아서 제대로 할당되지 않은 것인가? 그래서 해당 변수가 제대로 초기화 되지 않은거 같은데?" 따라서 저는 중괄호를 통해 요소 하나 하나에 할당해주었죠.

중괄호로 초기화
경고

그 결과 그전에 존재하던 경고는 사라졌으나 새로운 경고가 나타났습니다. 그래서 저는 구글링을 통해 배열에서 하나씩 요소할당할 경우 널문자 또한 함께 할당해주어야 한다는 사실을 알아냈습니다.

수정본 - 2
결과

그래서 이런 형태할당을 한 결과 모든 경고들이 사라졌습니다~ 이처럼 모르는 경고오류가 뜨더라도 구글링 통해 실력향상되는 계기가 될 수 있으니 너무 움츠러들지 마시고 시도할 수 있는 이론적인 부분모두 시도해보시는 게 좋습니다.

 

이제 코드본격적으로 설명해보겠습니다. strcmp(s1, s2);처럼 strcmp 함수에 비교할 문자열을 넣어주면 결과정수형 반환합니다. (문자열을 비교할 때 대소문자구분해요.)

반환하는 정수
문자의 아스키 코드 값
결과

여기서는 s2(Hello~)s1(Hello?)보다 크므로 -1반환합니다. 그리고 문자열 저장 방식문자열 비교에 전혀 영향을 주지 않습니다만 strcmp 함수는 문자열 첫 번째 문자부터 차례대로 비교하며 기준은 각 문자의 아스키 코드입니다.

아스키 코드로 구분
결과

+ 사용자의 입력값(문자열) 비교

사용자의 입력값 비교
결과

아스키코드구분한다는 게 무슨 의미인지 모르시는 분이 계실거 같아서 strcmp 함수가 무엇을 기준으로 하는지 간단히 알 수 있도록 코드 하나를 작성했습니다.

#include <stdio.h>
#include <string.h>

int main()
{
	int result = 0;
	char str_length_s1[10] = { 0, };
	char str_length_s2[10] = { 0, };

	printf("비교할 문자열 2개를 공백으로 구분해 입력해주세요\n");
	printf("입력 : ");
	scanf_s("%s %s", str_length_s1, (unsigned char)sizeof(str_length_s1), str_length_s2, (unsigned char)sizeof(str_length_s2));

	result = strcmp(str_length_s1, str_length_s2);

	int s1_ascii_size = 0;
	int s2_ascii_size = 0;

	if (str_length_s1 != NULL)
		for (int i = 0; str_length_s1[i] != '\0'; i++)
			s1_ascii_size += str_length_s1[i];
	if (str_length_s2 != NULL)
		for (int i = 0; str_length_s2[i] != '\0'; i++)
			s2_ascii_size += str_length_s2[i];

	switch (result)
	{
	case 0: {
		printf("%s 와 %s 가 동일합니다.\n", str_length_s1, str_length_s2);
		break;
		}
	case -1: {
		printf("%s 가 %s 보다 큽니다.\n\n", str_length_s2, str_length_s1);
		printf("%s의 아스키코드 총합 -> %d\n", str_length_s1, s1_ascii_size);
		printf("%s의 아스키코드 총합 -> %d\n", str_length_s2, s2_ascii_size);
		break;
		}
	case 1: {
		printf("%s 가 %s 보다 큽니다.\n\n", str_length_s1, str_length_s2);
		printf("%s의 아스키코드 총합 -> %d\n", str_length_s1, s1_ascii_size);
		printf("%s의 아스키코드 총합 -> %d\n", str_length_s2, s2_ascii_size);
		break;
		}
	}

	return 0;
}

결과

이해 되시나요?

다만,, 이 strcmp 함수에서는 운영체제에 따라 동작방식이 다르기 때문에 주의가 필요합니다.

 

C언어는 비교 연산자비교할 수 있는데 문자열 비교하는 strcmp 함수 등을

표준 라이브러리 함수제공하는 이유가 무엇일까요?

비교 연산으로 문자열 비교
결과

이처럼 메모리 주소으로 가지는 배열 비교 연산을 할 경우 메모리 주소를 비교하기 때문에 우리가 원하는 문자열의 내용비교하는 게 아닌 메모리 주소비교하게 되어서 원하지 않는 결과가 나오게 됩니다. 따라서 C언어문자열 비교 표준 라이브러리제공하고 있습니다.

'C Language Basic' 카테고리의 다른 글

C Language [핵심정리] - 21  (0) 2021.06.01
C Language [핵심정리] - 20  (0) 2021.05.30
C Language [핵심정리] - 19  (0) 2021.05.28
C Language [핵심정리] - 18  (2) 2021.05.27
C Language [핵심정리] - 17  (0) 2021.05.25
Comments