티스토리 뷰

안녕하세요, IT디자이너입니다.

 

이번에는 간단한 번역기 프로그램을 구현해보록 하겠습니다. 문자열 관련 함수 연습에 도움이 될것입니다.!!

 

 

1. 실행 예제

위 사진처럼 우리가 입력한 문자열을 한 단어씩 번역하여 출력하고 있습니다.

 

여기서 주의해야 할 점은 공백을 입력 받을 수 없는 scanf(); 함수를 사용할 수 없다는 것입니다.

 

즉, gets() 함수를 사용하여야 합니다. 

 

또한, C언어의 문자열 특성인 ( Null terminated byte string )  고려하여야 합니다. 즉, 일반적으로 배열이나 포인터로 된 변수가 문자열을 읽을 때 딱! NULL 까지만 읽게됩니다.

 

이러한 특성을 사용하면 문자열 공백 (" " or 아스키 코드 : 0x20 )을 NULL( 아스키코드 : '\0')으로 변경하여 단어 하나 하나를 출력하여 번역하면 됩니다.!!!

 

 

언제나 답은 혼자서 만들어본 후 확인하셔야됩니다.~~~ ;)

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string.h>

#define MAX_WORD 14 // 단어의 길이

// 3차원 배열로 구성된 단어사전입니다. 첫 번째 인덱스는 번역가능한 단어의 개수이며,
// 두번째 배열에서의 0은 영어 1은 한글을 뜻합니다.
// 세번째 배열은 단어마다의 길이를 뜻합니다.
char libBook[MAX_WORD][2][32] = { 
	{"i","나"},
	{"you","너"},
	{"he","그"},
	{"she","그녀"},
	{"man","남자"},
	{"woman","여자"},
	{"boy","소년"},
	{"girl","소녀"},
	{"Chan","찬"},
	{"name","이름"},
	{"is","은(는)"},
	{"ars","은(는)"},
	{"am","은(는)"},
	{"a","한"},
};

void Trans(char* sziN, char* szOut, int* ipWordCount); // 번역할 문장의 포인터, 번역된 문장의 포인터, 번역된 단어의 개수

char* FindWord(char* szEng); // 단어를 사전에서 찾을 때

int main()
{
	char szInText[128] = ""; // 사용자가 입력한 영어 문자열
	
	char szOutText[256] = ""; 
	// 번역된 문자열 C언어는 멀티바이트로 아스키코드를 사용합니다. 즉, 한글은 2byte이기 때문에 문자열을 2배로 하였습니다.
	
	int iWordCount = 0; // 몇개의 단어를 번역하였는지 체크하기 위한 변수입니다.

	printf_s("63자 이하로 영어를 입력해주세요 \n");

	gets_s(szInText); // 사용자의 문자열 입력

	
	_strlwr_s(szInText); // 모든 문자를 소문자로 바꾸어주는 코드입니다. 

	Trans(szInText, szOutText, &iWordCount); // 번역할 문장과 번역된 문장 번역된 단어의 개수 포인터를 매개변수로 전달합니다.

	printf_s(" - 총 %d개의 단어가 번역되었습니다.", iWordCount); // 번역된 문자열 출력
	printf_s("\n번역 : %s\n", szOutText); // 번역된 단어 개수 출력

}

void Trans(char* szIn, char* szOut, int* ipWordCount) {

	char* cheEngPtr, *cheKorPtr; // 원래의 데이터를 보관하기 위해 새롭게 영어와 한글 버퍼를 만듭니다.

	int iLen = strlen(szIn)+1;  // 입력된 문자열의 개수를 저장합니다. 맨 끝의 NULL의 개수를 포함하기 위해 +1을 합니다.

	cheEngPtr = szIn; // 입력된 영문자열을 영어 버퍼에 담습니다.

	for (int iCount = 0; iCount < iLen; iCount++) { // 문자열 길이만큼 반복

		if (' ' == szIn[iCount] || szIn[iCount] == '\0') { // 공백이거나 NULL을 만나면 실행

			szIn[iCount] = '\0'; // NULL문자 삽입
			
			cheKorPtr = FindWord(cheEngPtr); // 단어 찾기

			if (NULL == cheKorPtr) { // 번역되지 않으면 실행하는 코드
				strcat(szOut, cheEngPtr); // strcat은 첫번째 매개변수 뒤에 두번째 매개변수를 붙입니다.
				strcat(szOut, " ");			
			}
			else {
				strcat(szOut, cheKorPtr);	// 번역된 문자를 szOut 문자열 뒤에 붙인다.
				strcat(szOut, " ");
				(*ipWordCount)++; // 번역된 개수를 카운팅합니다.
			}
			cheEngPtr = &szIn[iCount + 1]; // " "을 삽입하였기 때문에 인덱스를 +1 합니다.
		}
	}

}

char* FindWord(char* szEng) {

	int iCount;

	for (iCount = 0; iCount < MAX_WORD; iCount++) {
		if (0 == strcmp(szEng, libBook[iCount][0])) { // 동일한 문장을 찾으면 리턴합니다.

			return libBook[iCount][1];
		}
	}

	return NULL; // 찾지 못했으면 NULL을 리턴합니다.
}

 


이렇게 간단한 번역 프로그램을 만들어보았습니다. 

 

이러한 문자열관련 함수들은 코딩테스트에 간혹 출제되는 문제이며, 또는 문자열 함수 자체를 만들어보는 코딩테스트도 있으니 익숙해지시길 바랍니다.!! 

 

IT디자이너였습니다.

 

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함