//***************************************************************************** // 문자열의 모든 치환 대상을 치환시킨다. // // Paremeters // char *szDest : 치환이 끝난 문자열을 담을 포인터 // char *szSrc : 치환시킬 문자열 // int nMaxLength : 치환시킨 후의 내용을 담을 최대 길이 // Return Values // bool : 하나라도 치환을 했는지 여부 // Remark // 치환후 길이가 nMaxLength 보다 길어지면 ''로 치환시킨다. // ReplaceWord에서 szDest에 들어갈 문자열이 szSrc의 문자열보다 10배 이상 // 길면 에러가 나게 된다. 주의!! (예 : A를 ABCDEFGHIJK로 치환시키면 에러!) // 무한 치환이 되지 않도록 주의할 것! (예 : A를 AA로 치환하면 무한 치환한다!) //***************************************************************************** bool ITextFilter::Replace(char *szDest, char *szSrc, int nMaxLength) { if (!IsHaveReplace(szSrc)) { GetStringPart(szDest, szSrc, nMaxLength); return false; } char *l_szStr = (char*) malloc(strlen(szSrc) + 1); strcpy(l_szStr, szSrc); while (IsHaveReplace(l_szStr)) { char *l_szTargetOffset = NULL, *l_szTargetString = NULL, *l_szReplaceString = NULL; int l_nTargetLength = 0; // 바꿔야 할 스트링을 l_szTargetString에 저장. l_szTargetOffset = GetReplaceTarget(&l_nTargetLength, l_szStr); l_szTargetString = (char*) malloc(l_nTargetLength + 1); GetStringPart(l_szTargetString, l_szTargetOffset, l_nTargetLength); // 바뀐 뒤의 스트링을 l_szReplaceString에 저장. l_szReplaceString = (char*) malloc(l_nTargetLength * 10 + 1); ReplaceWord(l_szReplaceString, l_szTargetString, l_nTargetLength * 10); // 치환했을 경우 nMaxLength를 넘어가지 않는지 검사. if (strlen(l_szStr) + strlen(l_szReplaceString) - strlen(l_szTargetString) > nMaxLength) strcpy(l_szReplaceString, ""); // 치환 strcpy(l_szTargetOffset + strlen(l_szReplaceString), l_szTargetOffset + strlen(l_szTargetString)); memcpy(l_szTargetOffset, l_szReplaceString, strlen(l_szReplaceString)); free(l_szTargetString); free(l_szReplaceString); } GetStringPart(szDest, l_szStr, nMaxLength); free (l_szStr); return true; }
int main(){ char id[12], temp[12], valid = 1; int i; scanf("%s", id); for(i = 0; i < strlen(id); i++) if(!isdigit(id[i])){ valid = 0; break; } if(i > 10) valid = 0; if(valid == 1){ GetStringPart(id, temp, 0, 2); int year = atoi(temp); GetStringPart(id, temp, 2, 2); int month = atoi(temp); if(!((month >= 1 && month <= 12) || (month >= 1+20 && month <= 12+20) || (month >= 1+40 && month <= 12+40))){ valid = 0; } GetStringPart(id, temp, 4, 2); if(atoi(temp) > GetMaxDateForMonth(month, year)){ valid = 0; } int ctrlNum = ControlNum(id); if(atoi(&id[9]) != ctrlNum) valid = 0; } printf("%d", valid); return 0; }
//***************************************************************************** // 욕 DATA 파일을 불러온다. // // Paremeters // const char *szFName : 불러올 파일 이름 // Return Values // void // Remark //***************************************************************************** HRESULT CNSlangTextFilter::Load(const char *szFName) { FILE *pFile = fopen(szFName, "r"); if (pFile == NULL) return false; char l_szStr[1024]; m_nSlangNumber = 0; while (fgets(l_szStr, 1023, pFile) != NULL) { Trim(l_szStr, l_szStr); if (l_szStr[0] != '/'&&l_szStr[1] != '/' && strlen(l_szStr) != 0) m_nSlangNumber++; } m_szaSlangTarget = new char*[m_nSlangNumber]; m_szaSlangReplace = new char*[m_nSlangNumber]; for (int n = 0; n < m_nSlangNumber; n++) { m_szaSlangTarget[n] = new char[SLANG_LENGTH_MAX]; m_szaSlangReplace[n] = new char[SLANG_LENGTH_MAX]; } fseek(pFile, 0, 0); int n = 0; while (fgets(l_szStr, 1023, pFile) != NULL) { Trim(l_szStr, l_szStr); if (l_szStr[0] != '/' && l_szStr[1] != '/' &&strlen(l_szStr) != 0) { if (strstr(l_szStr, ":") == NULL) { strcpy(m_szaSlangTarget[n], l_szStr); strcpy(m_szaSlangReplace[n], ""); } else { GetStringPart(m_szaSlangTarget[n], l_szStr, strstr(l_szStr, ":") - l_szStr); strcpy(m_szaSlangReplace[n], strstr(l_szStr, ":") + 1); } n++; } } fclose(pFile); return true; }
//***************************************************************************** // 특정 문자열을 무엇으로 치환해야 하는지 찾아낸다. // // Paremeters // char *szDest : 치환한 뒤의 문자열을 저장할 포인터 // const char *szSrc : 치환할 문자열 // int nMaxLength : szDest 버퍼의 최대 크기 // Return Values // void : // Remark // 치환한 문자열이 없으면 ""이 들어간다. //***************************************************************************** void CNSlangTextFilter::ReplaceWord(char *szDest, const char *szSrc, int nMaxLength) { if (!IsInit()) return; char *l_szStr = (char*) malloc(strlen(szSrc) + 1); Trim(l_szStr, szSrc); for (int n = 0; n < m_nSlangNumber; n++) { if (strcmp(l_szStr, m_szaSlangTarget[n]) == 0) { GetStringPart(szDest, m_szaSlangReplace[n], nMaxLength); free(l_szStr); return; } } strcpy(szDest, ""); free(l_szStr); }
//***************************************************************************** // 한 문자열에서 특정 문자열의 위치를 찾아낸다. // // Paremeters // char *szStr : 검색할 문자열 (ex : ABCDEFG) // char *szCharSet : 찾는 대상 (ex : EF) // Return Values // char* : szChatSet의 위치 포인터. 없으면 NULL. // Remark // strstr과 기능과 사용법이 같으나 한글 find의 문제점을 해결 //***************************************************************************** char* ITextFilter::FindString(char *szStr, const char *szCharSet) { if (strlen(szStr) < strlen(szCharSet)) return NULL; for (int n = 0; n < strlen(szStr) - strlen(szCharSet) + 1;) { char *l_szStr = (char*) malloc(strlen(szCharSet) + 1); GetStringPart(l_szStr, szStr + n, strlen(szCharSet)); if ( CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, l_szStr,_tcslen(l_szStr), szCharSet, _tcslen(szCharSet)) ) { free(l_szStr); return (szStr + n); } free(l_szStr); if (ISHANGUL(szStr[n])) n += 2; else n++; } return NULL; }