프로그래밍 언어/C

문자열 함수 활용 feat)예외처리

gcreators 2024. 8. 14. 17:52
char cStr[] = {
	'H', 'e', 'l', 'l', 'o', ',' , ' ',
	'W', 'o', 'r', 'l', 'd', '!','\0'
};
char* str = "Hello, World!";

int cnt = 0;
while (cStr[cnt] != '\0')
{
    printf("cStr[%d]: %c\n", cnt, cStr[cnt]);
    ++cnt;
}
printf("cStr Length: %d\n", cnt);

문자열의 크기를 구하는 법에는 sizeof와 배열의 첫 요소를 나누는 형식도 있지만

다음과 같이 문자배열 0에서 부터 반복문을 돌려 나오는 cnt 값으로 문자열의 크기를 구하는 방법도 있다.

 

그런데.. 문자열의 크기를 구하는 법을 예시로 들어서 그렇지만

굉장히 자주 쓰이는 요소들은 우리가 함수를 통해 필요할 때 간편히 사용 할 수 있었던 것을 기억 할 것이다.

 

위에서 적은 문자열의 길이를 코드를 함수로 만든다면

int StrLen(const char* const _pStr) {
	
	int cnt = 0;
	while (_pStr[cnt] != '\0')
	{
		printf("_pStr[%d]: %c\n", cnt, _pStr[cnt]);
		++cnt;
	} //\0을 만날때까지 cnt에 1씩 숫자를 더해 배열의 크기를 구하는 코드
	return ++cnt; //위 반복문에는 \0이 미포함되어 있으므로 마지막에 ++를 통해 1의 크기를 더 올려준다
}

이런 형태로 함수를 만들어서

printf("cStr Length: %d\n", StrLen(cStr));
printf("str Length: %d\n", StrLen(str));

이렇게 간편하게 호출하여 활용 할 수 있을 것이다.

 

그런데 함수를 만들때 주의 사항이 있다

 

cStr과 str은 값이 들어 있기에 별 문제는 없지만

 

만약에 값이 없는 문자열이 들어갈 경우 프로그램에 이상이 생길 것이다

 

거기서 필요한 것이 바로 예외처리이다.

 

int StrLen(const char* const _pStr) {
	
	//예외처리(Exception)
	if (_pStr == NULL) //주소가 NULL이 들어온 경우, NULL Exception
	{
		printf("ERROR] _pStr is NULL\n");
		return -1;
	}
    
	int cnt = 0;
	while (_pStr[cnt] != '\0')
	{
		printf("_pStr[%d]: %c\n", cnt, _pStr[cnt]);

		++cnt;
	}
	return ++cnt;
}

다음과 같은 방법을 활용해서 NULL 값을 확인하고 에러문과 함께 함수호출을 종료하는 형태로 예외처리가 가능하다.

 

함수는 활용하기에 매우 편리한 기능이지만

잘못 활용 될 경우 프로그램이 터지는 상황이 나오기에 이런 예외처리까지 꼼꼼히 신경써서 프로그래밍을 하는 것이 핵심이다.

 

디버그(DEBUG)

위에서 선언한 함수를 다시 보자

#define DEBUG_MODE

int StrLen(const char* const _pStr) {
	
	//예외처리(Exception)
	if (_pStr == NULL) //주소가 NULL이 들어온 경우, NULL Exception
	{
#ifdef _DEBUG // Debug일때 활성화, Release일때 비활성화
		printf("File %s\n", __FILE__);
		printf("Line %d\n", __LINE__);

#endif 
		printf("ERROR] _pStr is NULL\n");
		return -1;
	}
	
	// TODO : 널 문자가 없는 문자열

	int cnt = 0;
	while (_pStr[cnt] != '\0')
	{
		//Debug Mode
		//조건부 컴파일(onditional Compile)
#ifdef DEBUG_MODE
		printf("_pStr[%d]: %c\n", cnt, _pStr[cnt]);
#endif

		++cnt;
	}
	return cnt;
}

몇가지 코드를 늘렸지만 같은 역할을 하는 함수이다.

 

printf를 우리가 계속 찍는 이유가 프로그래밍 된 값이 제대로 나오는지 눈으로 쉽게 확인하기 위해서이다.

 

이를 우리는 디버그 라고 부르는데 

 

프로그래밍중 확인이 끝난 코드를 다시 주석 처리를 한다던가 아니면 주석 처리 된 코드를 다시 풀어서 확인한다던가 하는 식으로 굉장히 거슬리고 귀찮을 때가 존재한다.

 

위 코드처럼 DEBUG를 입력해둔 경우

visual studio의 디버그 기능과 릴리즈 기능을 통해 이를 쉽게 껏다 켰다 할 수 있으니 참고 하도록 하자

'프로그래밍 언어 > C' 카테고리의 다른 글

다차원 배열(Multi-Dimensional Array)  (0) 2024.08.19
정적/동적 메모리 할당(Memory Allocate)  (0) 2024.08.16
문자열(String)  (0) 2024.08.14
함수(Function)  (0) 2024.08.13
포인터(Pointer)  (0) 2024.08.13