Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Вводы-вывод русских букв, язык C  (Прочитано 2012 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Вводы-вывод русских букв, язык C
« : 03 Января 2020, 18:41:49 »
Доброго времени суток. Некоторое время изучаю программирование на языке Си и столкнулся с ситуацией, что наблюдаю проблемы с вводом-выводом русских букв

Например такая программа:

Код: (с) [Выделить]
#include <stdio.h>
#include <locale.h>

int main(void) {
    setlocale(LC_ALL, "");
    printf("Введи BIG букву:\n");
    int ch = 0;
    ch = getchar();
    putchar(ch);
    return 0;
}
Правильно работает с английскими буквами, но с русскими буквами выводит белый ромбик со знаком вопроса:

Код: (html5) [Выделить]
Введи BIG букву:
Ж

Притом проблем с выводом русских букв написанных в самом тексте программы нет

Но вот такая программа даже без всяких локалей всё выводит правильно:

Код: (с) [Выделить]
#include <stdio.h>

int main(void) {
    printf("Введи BIG букву:\n");
    int ch[1] = {};
    scanf ("%s", ch);
    printf("%s", ch);
    return 0;
}

Код: (html5) [Выделить]
Введи BIG букву:
Ж
Ж

Я не понимаю чем вторая программа концептуально отличается от первой. Казалось бы если неверно работает первая, то и вторая должна работать неверно. А если верно работает вторая то и первая должна работать. Но это не так
« Последнее редактирование: 03 Января 2020, 19:36:32 от Azure »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #1 : 03 Января 2020, 19:38:59 »
А если хоть немного задуматься над тем, что кириллическая "буква" - это ДВА символа то все становится понятным.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #2 : 03 Января 2020, 20:46:11 »
Нет, мне не становится. И в первой и во второй программе для хранения символа русской буквы используется тип int, который в четыре раза больше типа char. Но в первом случае программа корректно не работает

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5583
  • Все по палатам!
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #3 : 03 Января 2020, 21:11:12 »
vanadium007, в первой вы используете функции работы с символами ввод,
во второй - со строками.
getchar ,берет из ввода 1 байт. Возвращает int - чтобы могла возвратить значение EOF - отличное от кода любого символа.
Первую можно немного поменять, типа
Цитировать
    #include <stdio.h>
    #include <locale.h>
     
    int main(void) {
        setlocale(LC_ALL, "");
        printf("Введи BIG букву:\n");
        int ch1 = 0, ch2 = 0;
        ch1 = getc(stdin);
        ch2 = getchar();
        putchar(ch1);
        if (ch2) putchar(ch2);
        return 0;
    }
чтобы вводила два байта и с русским как-то работать будет, но это просто "костыль" - чтобы вам понятнее было.
Извините, я все еще учусь

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #4 : 03 Января 2020, 21:26:44 »
Я предполагал что getchar и putchar работают именно с int'ами как блоками по четыре байта, а что тогда со scanf и printf со спецификатором %c? Тут уж тем более только с однобайтным типом char

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5583
  • Все по палатам!
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #5 : 03 Января 2020, 22:22:27 »
Я предполагал что getchar
В программировании гланое не предполагать, а ЗНАТЬ точно. Один неправильный бит в программе может полностью сделать ее неработающей... а в ОС и всю систему.
Посмотри описание в терминале
man getchar
Извините, я все еще учусь

 

Страница сгенерирована за 0.036 секунд. Запросов: 25.