fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct String {
  6. int* symbols;
  7. int size;
  8. int cap;
  9. };
  10.  
  11. void add_symbol(struct String* s, int symbol) {
  12. if (s->cap <= s->size) {
  13. s->cap = (1+s->cap)*2;
  14. s->symbols = realloc(s->symbols, s->cap*sizeof(int));
  15. }
  16. s->symbols[s->size++] = symbol;
  17. }
  18.  
  19. int next_or_die(unsigned char** p) {
  20. if (((**p) >> 6) != 0x2) {
  21. printf("UPS\n"); exit(-1);
  22. }
  23. return (*((*p)++)) & 0x3f;
  24. }
  25.  
  26. struct String readline() {
  27. struct String r;
  28. char buf[100000];
  29. unsigned char* p = (unsigned char*)&buf[0];
  30. memset(&r, 0, sizeof(r));
  31. fgets(buf, sizeof(buf), stdin);
  32. while (*p) {
  33. if ((*p & 0x80) == 0) {
  34. add_symbol(&r, *p++);
  35. } else if (((*p) >> 5) == 0x6) {
  36. int symbol = 0;
  37. symbol = ((*p++) & 0x1f) << 6;
  38. symbol |= next_or_die(&p);
  39. add_symbol(&r, symbol);
  40. } else if (((*p) >> 4) == 0xe) {
  41. int symbol = 0;
  42. symbol = ((*p++) & 0xf) << 12;
  43. symbol |= next_or_die(&p) << 6;
  44. symbol |= next_or_die(&p);
  45. add_symbol(&r, symbol);
  46. } else if (((*p) >> 3) == 0x1e) {
  47. int symbol = 0;
  48. symbol = ((*p++) & 0x7) << 18;
  49. symbol |= next_or_die(&p) << 12;
  50. symbol |= next_or_die(&p) << 6;
  51. symbol |= next_or_die(&p);
  52. add_symbol(&r, symbol);
  53. }
  54. }
  55.  
  56. return r;
  57. };
  58.  
  59. void printline(struct String s) {
  60. int i;
  61. for (i = 0; i < s.size; i++) {
  62. if (s.symbols[i] <= 0x7f) {
  63. putchar(s.symbols[i]);
  64. } else if (s.symbols[i] <= 0x7ff) {
  65. putchar((s.symbols[i] >> 6) | 0xc0);
  66. putchar((s.symbols[i] & 0x3f) | 0x80);
  67. } else if (s.symbols[i] <= 0xffff) {
  68. putchar((s.symbols[i] >> 12) | 0xe0);
  69. putchar(((s.symbols[i] >> 6)&0x3f)| 0x80);
  70. putchar((s.symbols[i]&0x3f) | 0x80);
  71. } else {
  72. putchar((s.symbols[i] >> 18) | 0xf0);
  73. putchar(((s.symbols[i] >> 12)&0x3f)| 0x80);
  74. putchar(((s.symbols[i] >> 6)&0x3f) | 0x80);
  75. putchar((s.symbols[i]&0x3f) | 0x80);
  76. }
  77. }
  78. putchar('\n');
  79. }
  80.  
  81. int min(int a, int b) {
  82. return a<b?a:b;
  83. }
  84.  
  85. struct String substring(struct String s, int from, int len) {
  86. struct String r = {
  87. s.symbols+min(s.size, from),
  88. min(s.size, from+len)-min(s.size, from)
  89. };
  90. return r;
  91. }
  92.  
  93. int main() {
  94. struct String r = readline();
  95. printf("len=%d\n", r.size);
  96. printline(r);
  97. printline(substring(r, 11, 11));
  98. free(r.symbols);
  99. return 0;
  100. }
  101.  
Success #stdin #stdout 0s 5624KB
stdin
Работаем с подстроками в unicode
stdout
len=32
Работаем с подстроками в unicode
подстроками