viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b38177a16fb3dab004c86b6f1a1232ae65b3ad2437808df24674120c2d3ecc4515736f9f2e19fab9e76726582a3a34e0bc22181bcec4a8764ef6e4afd2


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; }


아무도 안풀길레 그냥 올림 ㅡ,ㅡ


흐린바다, 잡대컴공 님 과제 수행 감사합니다.