본문 바로가기

자작 프로그램

문자열 크로스 예제

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
제가 예전에 네이버 지식iN에 답변했던 내용을 조금 수정해 보았습니다.
어떤 분께서 두 개의 문자열을 입력 받아서
공통으로 들어간 문자 하나를 찾아서 크로스 시키는 문제를 질문했었는데요

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=109898667&qb=66y47J6Q7Je0IOq1kOywqA==&enc=utf8&section=kin.qna&rank=1&search_sort=0&spq=0
그냥 다시 생각나길래
그 당시 제가 올렸던 답변을 조금 수정해서 다시 게시합니다. ㅋㅋ

일단 문자열을 전체적으로 TCHAR 형으로 조금 바꿔보았습니다.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <conio.h>
#include <wchar.h>
#include <tchar.h>
#include <locale.h>
#define STRING_BUFFER_SIZE 128
int main()
{
 _TCHAR stringA[STRING_BUFFER_SIZE], stringB[STRING_BUFFER_SIZE]; // 문자열 저장할 배열입니다.
 size_t lenA = 0, lenB = 0; // A와 B의 문자열 길이입니다.
 size_t crossA = 0, crossB = 0; // 교차 지점을 저장할 변수입니다.
 size_t tmpA = 0, tmpB = 0, tmpC = 0; // 다목적 임시 변수입니다.
 
 // 일단 콘솔의 로케일 설정
 setlocale(LC_ALL, "korean");
 // 메모리 모두 초기화
 memset(stringA, 0, STRING_BUFFER_SIZE * sizeof(_TCHAR));
 memset(stringB, 0, STRING_BUFFER_SIZE * sizeof(_TCHAR));
 
 // 첫 번째 문자열을 입력받습니다.
 _tprintf(_TEXT("문자열 A ==> "));
 // 문자셋에 따른 문자열 입력 처리...
#if defined(UNICODE) || defined(_UNICODE) // WBCS면?
 _tscanf(_TEXT("%ws"), stringA);
#else // 아니면?
 _tscanf(_TEXT("%s"), stringA);
#endif
 _tprintf(_TEXT("\n\r"));
 
 // 버퍼 지우고
 fflush(stdin);
 // 두 번째 문자열을 입력받습니다.
 _tprintf(_TEXT("문자열 B ==> "));
 // 이번에도 마찬가지로 문자셋에 따른 입력 처리
#if defined(UNICODE) || defined(_UNICODE) // WBCS면?
 _tscanf(_TEXT("%ws"), stringB);
#else // SBCS면?
 _tscanf(_TEXT("%s"), stringB);
#endif
 
 _tprintf(_TEXT("\n\r"));
 // 이제 각각의 문자열 길이 구할 차례
 lenA = _tcslen(stringA);
 lenB = _tcslen(stringB);
 
 // Step 1. 먼저 교차 지점을
 // 먼저 A는 세로로, B는 가로로 출력한다고 가정하죠.
 tmpC = 0; // tmpC는 교차지점 찾았을 경우 1로 바뀝니다.
 for(tmpA = 0; tmpA < lenA; tmpA++)
 {
  for(tmpB = 0; tmpB < lenB; tmpB++)
  {
   if(stringA[tmpA] == stringB[tmpB]) // 교차지점 찾았다면
   {
    crossA = tmpA; crossB = tmpB; tmpC = 1;
    break; // 찾았으니 루프 종료
   }
  }
  
  if(tmpC == 1) break; // 찾았으면 루프 종료
 }
 
 if(tmpC == 0)
 {
  _tprintf(_TEXT("교차 지점이 없네요 ㅈㅅ\n\r"));
  _tprintf(_TEXT("끝.\n\r"));
  _getch();
  return -1;
 } // 교차점 없네요...그럼 함수 종료
 // Step 2. 세로로 출력할 문자열에 대해 출력할 위치 지정.
 tmpC = 0; // 여기서는 교차지점이 아닌 줄을 출력할 때 공백 세는 용도
 
 // 이제 출력을 하죠. 먼저 A를 세로로 출력합니다.
 for(tmpA = 0; tmpA < lenA; tmpA++)
 {
  if(tmpA == crossA) // 교차지점이 있는 행을 출력하나?
  {
   // 그러면 B 문자열 출력
#if defined(UNICODE) || defined(_UNICODE)
   _tprintf(_TEXT("%s\n\r"), stringB);
#else
   _tprintf(_TEXT("%ws\n\r"), stringB);
#endif
  }
  
  else // 그게 아닌가?
  {
   for(tmpC = 0; tmpC < crossB; tmpC++) // 해당 열의 직전까지는 공백 출력
   {
#if defined(UNICODE) || defined(_UNICODE) // WBCS면?
    if(stringB[tmpC] >= (_TCHAR)0x0080) // U+0080 이상은 전각문자일거임
     _tprintf(_TEXT("  ")); // 공백 2개 출력
    else // 그 이하는 반각문자일거임
     _tprintf(_TEXT(" ")); // 공백 1개 출력
#else // MBCS면?
    _tprintf(_TEXT(" ")); // 공백 1개 출력
#endif
   }
   
   _tprintf(_TEXT("%c\n\r"), stringA[tmpA]); // 교차되는 열에서 문자 출력
  }
 }
 _tprintf(_TEXT("끝.\n\r"));
 _getch();
 return 0;
}

 

실행 결과는 이렇습니다.