336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
제가 예전에 네이버 지식iN에 답변했던 내용을 조금 수정해 보았습니다.
어떤 분께서 두 개의 문자열을 입력 받아서
공통으로 들어간 문자 하나를 찾아서 크로스 시키는 문제를 질문했었는데요
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=109898667&qb=66y47J6Q7Je0IOq1kOywqA==&enc=utf8§ion=kin.qna&rank=1&search_sort=0&spq=0
그냥 다시 생각나길래
그 당시 제가 올렸던 답변을 조금 수정해서 다시 게시합니다. ㅋㅋ
일단 문자열을 전체적으로 TCHAR 형으로 조금 바꿔보았습니다.
실행 결과는 이렇습니다.
어떤 분께서 두 개의 문자열을 입력 받아서
공통으로 들어간 문자 하나를 찾아서 크로스 시키는 문제를 질문했었는데요
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=109898667&qb=66y47J6Q7Je0IOq1kOywqA==&enc=utf8§ion=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>
#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");
{
_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
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);
// 버퍼 지우고
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"));
_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. 먼저 교차 지점을
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;
} // 교차점 없네요...그럼 함수 종료
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]); // 교차되는 열에서 문자 출력
}
}
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;
}
_getch();
return 0;
}
실행 결과는 이렇습니다.
'자작 프로그램' 카테고리의 다른 글
Windows Mobile용 스톱워치 프로그램 (0) | 2011.04.25 |
---|---|
간단한 C# LINQ 식 예제 (0) | 2011.03.20 |
문자열 빈도 프로그램 (0) | 2011.02.28 |
FindFirstFile, FindNextFile, FindClose 예제 (0) | 2011.02.28 |
대/소문자 변환 예제 (0) | 2011.02.27 |