Использование UTF-8 в компиляторе C - PullRequest
0 голосов
/ 22 апреля 2020

Я новичок в C программировании, и у меня есть задача. Моя домашняя работа точно такая:

Предположим, что вы сканируете вводимый текст в Turki sh символ за символом с клавиатуры, которую вы можете рассматривать как устройство ввода по умолчанию, до появления CTRL- D 'нажата. Вы должны пропустить знаки пунктуации, а также пустой символ. Ваша программа будет отображать частоты букв и цифр, когда процесс сканирования будет завершен. Вам нужно обсудить структуру данных, а также решение потоковой диаграммы и передать их вместе с вашим кодом.

Я написал программу, но у меня возникла проблема. Некоторые введенные символы (например, ğ) отображаются как §. Вот мой исходный код.

#include <stdio.h>
#include "stdlib.h"
#include <locale.h>


int main()
{
    char message[100] = { ' ' };
    char ch;
    int i = 0, j = 0, k = 0;

    setlocale(LC_ALL, "Turkish");

    printf("Enter your message: ");

    while ((ch = getchar()) != '\4')
    {
        message[i] = ch;
        i++;
    }

    for (int j = 0; j <= i; j++)
    {
        int repeated = 1;

        for (int k = (j + 1); k <= i; k++)
        {
            if (message[k] == message[j])
            {
                repeated++;
            }
        }
        printf("%c is repeated %d times.\n", message[j], repeated);
        while (message[j] == message[j + 1])
        {
            j = j + 1;
        }
    }

    system("PAUSE");
    return 0;
}

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 22 апреля 2020

ğ является многобайтовым символом (занимает 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;
}
...