fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char* slice( const char* str, size_t length,
  5. const size_t offset = 0,
  6. const size_t copy = 1, const size_t skip = 0,
  7. size_t remainder = 1 )
  8. {
  9. if( length <= offset ) return NULL;
  10. length -= offset;
  11.  
  12. remainder = remainder > 0;
  13. const size_t pair = copy + skip;
  14. const size_t pairs = length / pair * pair;
  15. remainder = length % pair * remainder;
  16.  
  17. char* src = (char*)str + offset;
  18. char* new_str = (char*)malloc( pairs + remainder );
  19. const char* end = src + pairs;
  20. char* dst = new_str;
  21.  
  22. while( src < end )
  23. {
  24. for( size_t i = 0; i < copy; ++i )
  25. dst[i] = src[i];
  26. src += pair;
  27. dst += copy;
  28. }
  29.  
  30. for( size_t i = 0; i < remainder; ++i )
  31. dst[i] = src[i];
  32. dst[remainder] = 0;
  33.  
  34. return new_str;
  35. }
  36.  
  37. int main()
  38. {
  39. puts( slice( "01234567", 8, 0, 1, 1 ) );
  40. puts( slice( "%01234567", 9, 1, 1, 1 ) );
  41. puts( slice( "%01%23%45%67", 12, 1, 2, 1 ) );
  42. puts( slice( "%01%23%45%6789", 14, 1, 2, 1 ) );
  43. puts( slice( "%01%23%45%6789", 14, 1, 2, 1, false ) );
  44. return 0;
  45. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
0246
0246
01234567
012345679
01234567