ğ
является многобайтовым символом (занимает 2 байта), и вы не можете напечатать его с помощью %c
и не считать его нормальным (2 байта должны быть пропущены при цикле).
Но вам не нужно этого делать, C предоставляет библиотеки для работы с многобайтовыми символами.
Вы можете использовать wchar_t
вместо char
, также заменить getchar
на getwchar
и printf
на wprintf
, наконец, обратите внимание, что все строковые литералы имеют суффикс L
и символы печатаются с использованием спецификатора формата %lc
.
Ваш рабочий код:
#include <stdio.h>
#include "stdlib.h"
#include <locale.h>
#include <wchar.h>
int main()
{
setlocale(LC_ALL, "");
#define N 100
wchar_t message[N];
struct
{
wchar_t value;
int count;
} letters[N] = {{0, 0}};
wprintf(L"Enter your message:\n");
wint_t ch;
int len = 0;
while ((ch = getwchar()) != '\n')
{
if (len < N)
{
message[len++] = ch;
}
}
int n = 0;
for (int i = 0; i < len; i++)
{
int j;
for (j = 0; j < n; j++)
{
if (letters[j].value == message[i])
{
break;
}
}
if (j == n)
{
letters[j].value = message[i];
n++;
}
letters[j].count++;
}
for (int i = 0; i < n; i++)
{
wprintf(L"%lc is repeated %d times.\n", letters[i].value, letters[i].count);
}
return 0;
}