#include <stdio.h>
#include <stdlib.h>
/*
Функция сравнивает стрки
*/
int str_comp(const char *a, const char *b){
while (*a && *b && *a == *b)
++a, ++b;
return *a - *b;
}
/*
Функция определяет длину строки в байтах
*/
int str_len(const char *str) {
int res;
for (res = 0; *str != '\0'; str++, res++);
return res;
}
/*
Функция определяет длину символа UTF-8
*/
int u8_char_len(char first_byte) {
unsigned short int bytes = 0;
if ((first_byte & 0xC0) == 0xC0) {
if ((first_byte & 0xF0) == 0xF0) bytes = 4;
else if ((first_byte & 0xE0) == 0xE0) bytes = 3;
else bytes = 2;
} else bytes = 1;
return bytes;
}
/*
Функция определяет длину строки UTF-8
*/
int u8_str_len(const char *str) {
int count;
for (count = 0; *str != '\0'; str += u8_char_len(*str), count++);
return count;
}
/*
Функция возвращает символ строки UTF-8 по номеру
*/
char* u8_str_index(char *str, int index) {
static char res[5];
int i, j, count, start_index, stop_index;
for (i = 0, count = 0; count <= index; i += u8_char_len(str[i]), count++) {
if (count == index) {
start_index = i;
stop_index = i + u8_char_len(str[i]);
break;
} else if (str[i] == '\0') {
printf("%s %d %s",
"!!! Выход за пределы диапазона: элемент с индексом",
index, "отсутствует\n");
exit(EXIT_FAILURE);
}
}
for (j = start_index; j < stop_index; j++) {
res[j - start_index] = str[j];
}
res[stop_index - start_index] = '\0';
return res;
}
int main(void) {
char str[] = "Иероглифы-漢字!";
printf("%d\n\n", str_len(str));
printf("%s\n", u8_str_index(str, 1));
printf("%d\n", u8_str_len(str));
printf("%d\n", u8_str_len(str));
printf("%s\n", u8_str_index(str, 1));
printf("%s\n", u8_str_index(str, 2));
printf("%d\n", u8_str_len(str));
printf("%s\n", u8_str_index(str, 4));
printf("%s\n", u8_str_index(str, 5));
printf("%s\n", u8_str_index(str, 6));
printf("%s\n", u8_str_index(str, 11));
printf("%s\n", u8_str_index(str, 19));
printf("%s\n", u8_str_index(str, 18));
return 0;
}