어제자 Slicing 과제 코드
코로모(qscsq)
2015-12-07 18:37
추천 0

char*
Slicing(const char* str, size_t jmp, size_t starts, size_t len, int remain)
{
// 먼저 입력된 str의 총 길이를 구한다.
size_t stringLen = strlen(str);
// slicing을 실행할 실제 길이이다. starts부터 시작해야하므로
// 계산될 실제길이는 (길이 - starts)이다.
size_t length = stringLen - starts;
// 예외처리: starts가 문자열의 길이를 넘어서는 경우 계속할 수 없다.
// jmp가 0이면 str의 첫 번째 문자가 무한히 반복된 문자열이 만들어지므로
// 이는 예외에 해당한다.
if (length == 0 && length > stringLen && len == 0 && jmp == 0)
return NULL;
// len이 length보다 큰 경우엔 remain에 따라 결정해야 한다.
if ( len <= length )
{
// slicing을 하기위한 최적의 조건은 ("#",1,1,2,0) 와 같은 jmp+len으로
// 나누어 떨어지는 길이를 가진 str이라 할 수 있다. 즉, 꽉 채워진 한 칸을 의미한다.
size_t chunkLen = jmp + len;
// 남은 길이를 제외한 확실히 채워질 수 있는 길이을 의미한다.
// 청크의 개수 * len으로 정의될 수 있다.
size_t fixedLen = (length / chunkLen) * len;
// ("#%4",1,1,2,0)의 경우 청크가 3이므로 "4"가 남는다.
// 즉, 청크로 나눈 나머지가 마지막 남은 길이임을 알 수 있다.
size_t lastRemain = length % chunkLen;
// 이제 전체 길이를 계산한다.
// lastRemain >= len 이면 len만큼 더 추가시키면된다.
// lastRemain이 len보다 작으면 그 reamin의 여부에 따라 그 남은 길이만큼 더해준다.
size_t remainLen = lastRemain >= len ? len : (remain ? lastRemain : 0);
size_t totalLen = fixedLen + remainLen;
// sizeof(char)은 1이다. 곱해도 그만, 안곱해도 그만이다.
char* collect = (char *)
malloc(totalLen + 1);
char* colptr = collect;
// remain의 여부에 따라 복사할 길이가 달라진다.
// 그러므로 lastRemain은 마지막에 처리하고 남은 길이만 완벽히 복사한다.
size_t copyLen = length - lastRemain;
size_t countLen = starts;
// copyLen만큼 처리하고 남은 길이는 remain의 여부에 맡긴다.
for (; countLen < copyLen; countLen += chunkLen)
{
memcpy(colptr, str + countLen, len);
colptr += len;
}
// 남은 길이를 더한다.
if ( remainLen )
{
memcpy(colptr, str + countLen, remainLen);
}
collect[totalLen] = 0;
return collect;
}
else if ( remain )
{
// len이 큰 length보다 큰 경우엔 남는 부분은 length 전체이다.
char* ret = (char *)
malloc(length + 1);
memcpy(ret, str + starts, length);
ret[length] = 0;
return ret;
}
return NULL;
}
아무도 안풀길레 그냥 올림 ㅡ,ㅡ
흐린바다, 잡대컴공 님 과제 수행 감사합니다.
퍄... 졸라깔끔...
어제 과제수행 게시글 올려놓고서 3번 더 고쳤습니다 ...