티스토리 뷰
안녕하세요, 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디자이너였습니다.
감사합니다.
'문제풀이 > C & C++ 언어 문제풀이' 카테고리의 다른 글
C/C++ 타이밍 맞추기 미니게임!! (feat. 리듬게임) (0) | 2020.04.02 |
---|---|
C/C++ 재귀함수를 사용하지 않고 페인트칠하기! (3) | 2020.03.26 |
C/C++ 재귀함수 활용하여 페인트칠하기! (0) | 2020.03.24 |
C/C++ 비트연산자 및 삼각함수 문제풀이 연습 (0) | 2020.03.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C언어 #C++ #캐시hit #캐시라인 #캐시무효화
- C언어 #자료구조 #C++ #연결리스트 #리스트 #알고리즘 #IT디자이너
- C언어 #C++ #IT디자이너
- 스택 #자료구조 #Stack #IT디자이너 #알고리즘 #C언어 #스택 과제 #C++
- C언어 #스트림 #버퍼링 #표준 입출력 함수 #C++언어 #IT디자이너
- C언어 #C++ #구조체 정렬 #pragma #IT디자이너
- C언어 #C++ #어셈블리어 #구조체 #구조체 특징 #IT디자이너
- Debug #C언어 #C++ #비쥬얼스튜디오 #Release #IT
- IT디자이너 #C언어 #C++ #속성지정자 #기억클래스 #IT #const #static #register #volatile #extern #auto #s
- C언어 #C++ #switch #if #어셈블리어 #switch문 사용 이유 #IT디자이너
- 디버그 #Debug #Release #디버그와 릴리즈 차이 #C언어 #C++언어 #어셈블리어
- C언어 #포인터 #IT디자이너
- C언어 #C++ #삼각함수 #IT디자이너 #문제풀이 #2진수 #16진수 #비트 #bit #비트연산자
- C언어 #IT디자이너 #포인터 #배열 #포인터와 배열
- C언어 #IT디자이너
- C언어 #C++ #IT디자이너 #C++ 함수
- IT디자이너 #QuickSort #퀵정렬 #C언어 #C++ #자료구조 #알고리즘
- C언어 #C++ #파일 입출력 #텍스트파일 #IT디자이너
- C언어 #C++ #어셈블리어 #함수 호출 규약 #IT디자이너 #비쥬얼 스튜디오 #IT
- C언어 #IT디자이너 #C++언어
- C언어 #C++ #자료구조 #알고리즘 #IT디자이너 #버블 정렬 #BubbleSort
- 어셈블리어 #IT디자이너 #C언어 #C++언어 #어셈블리 #어셈블러
- QUEUE #큐 #자료구조 #원형 큐 #Circle Queue #IT디자이너 #큐 과제 #C언어 #C++언어
- C언어 #C++ #어셈블리어 #열거형 데이터타입 #IT디자이너
- C언어 #포인터 #배열 포인터 #포인터 배열 #함수
- C언어 #C++ #어셈블리어 #재귀함수 #IT디자이너
- C언어 #C++ #IT디자이너 #함수 #재귀 함수 #스택 #자료구조 #페인팅
- C언어 #C++ #시간 함수 #타이밍 맞추기 #timer interrupt #IT디자이너
- C언어 #C++ #어셈블리어 #IT디자이너 #비트연산자 #연산자 #C언어의 비트 연산자
- IT디자이너 #C언어 #C++ #IT디자이너 #코딩테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함