Проблема с русскими символами
#include <stdio.h>
int main()
{
char *msg = "Не звони мне";
puts(msg+3);
return 0;
}
По идее, вывод должен быть "звони мне", но выводится "� звони мне". Единственное логичное объяснение, которое я нашёл, это то, что русские символы занимают 2 байта, и потому "Не" и пробел будет 5 байтов puts(msg+5);. Разве этим не должен заниматься компилятор?
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
В Си массивы имеют только фиксированные размеры элементов. В строках или по байту или по два байта. А UTF-8 имеет плавающий размер (1-6) байт. Если вам нужны точная фиксация элементов строки , то придётся пользоваться wchar_t со всеми вытекающими функциями конвертации.
// gcc -Wall -std=c11 -Wextra dontring.c -o dontring
# include <stdio.h>
# include <wchar.h>
# include <locale.h>
int main()
{
setlocale(LC_ALL,"");
wchar_t const msg[] = L"Не звони мне";
fputws(&(msg[3]),stdout);
return 0;
}
вывод :
> ./dontring
звони мне