CS/C

20240109 C - Lower, Upper, Swap과 예외처리 문제

싹난 감자 2024. 1. 10. 09:35
#include <stdio.h>
#include <stdlib.h>

//Lower 소문자로
//Upper 대문자로
//Swap 소->대 대->소
//ASCII CODE

char* Lower(char _str[], int _len);
char* Upper(char _str[], int _len);
char* Swap(char _str[], int _len);

int main() {
	char str[] = "Hello, World!";
	int len = sizeof(str) / sizeof(str[0]);
	int i = 0;

	printf("%s\n", str);
	printf("%s\n", Lower(-5, len));
	printf("%s\n",Upper(str, len));
	printf("%s\n", Swap(str, len));


	return 0;
}

char* Lower(const char _str[], int _len) {
	int i = 0;
	static char temp[50];
	if (_str == NULL ) {
		printf("NULL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	else if (_str >= 0 && _str <= 31) {
		printf("문자만!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	else if (_str <= 0 || _str == "") {
		printf("문자만!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	while (_str[i] != '\0') {
		if (i >= 50) {
			printf("너무긺!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
			return 0;
		}
		else{
			temp[i] = _str[i];
		}
		++i;
	}
	temp[i] = '\0';
	for (i = 0; i < _len; ++i) {
		if (temp[i] > 65 && temp[i] <= 90) {
			temp[i] = temp[i] + 32;
		}
	}
	return temp;
}

char* Upper(const char _str[], int _len) {
	int i = 0;
	static char temp[50];
	if (_str == NULL) {
		printf("NULL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	else if (_str >= 0 && _str <= 31) {
		printf("문자만!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	while (_str[i] != '\0') {
		if (i >= 50) {
			printf("너무긺!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
			return 0;
		}
		else {
			temp[i] = _str[i];
		}
		++i;
	}
	temp[i] = '\0';
	for (i = 0; i < _len; ++i) {
		if (temp[i] > 97 && temp[i] <= 122) {
			temp[i] = temp[i] - 32;
		}
	}
	return temp;
}

char* Swap(const char _str[], int _len) {
	int i = 0;
	static char temp[50];
	if (_str == NULL) { 
		printf("NULL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	else if (_str >= 0 && _str <= 31) {
		printf("문자만!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		return 0;
	}
	while (_str[i] != '\0') {
		if (i >= 50) {
			printf("너무긺!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
			return 0;
		}
		else {
			temp[i] = _str[i];
			++i;
		}
		
	}
	temp[i] = '\0';
	for (i = 0; i < _len; ++i) {
		if (temp[i] > 97 && temp[i] <= 122) {
			temp[i] = temp[i] - 32;
		}
		else if (temp[i] > 65 && temp[i] <= 90) {
			temp[i] = temp[i] + 32;
		}
	}
	return temp;
}

Lower(0, len) 등 0부터 31까지는 아스키 코드로 의미가 있는 숫자이기 때문에 직접 넣을 경우 문제가 발생

(0은 NULL이 들어가는 등)

해당 숫자가 들어왔을 경우 바로 return 0;

 

Lower(-1, len) 등 음수를 넣으면 터지는 문제가 발생

temp의 길이보다 긴 문자열이 들어오면 에러 발생

-> 문자를 입력 받을 때 scanf나 직접 초기화 하는 방식 말고

  fget()으로 입력받으면 원하는 길이 이상의 문자는 자동으로 잘려서 저장됨.

  숫자 등이 들어와도 문자로만 저장되어서 의도치 않은 값이 저장되는 것을 방지

'CS > C' 카테고리의 다른 글

20240111 C - Enum(열거체)  (1) 2024.01.11
20240110 C - 포인터와 메모리 관리  (2) 2024.01.10
20240109 C - 구조체  (1) 2024.01.10
20240109 C - 2차원 배열  (1) 2024.01.10
20240109 C - 문자열  (0) 2024.01.10