Задали задачу на c

Написать вывод всех чисел с кодами от -128 до 127. Как меняется вывод в зависимости от выбранной кодировки? В windows гуглить команду для смены кодировки внутри текущего окна терминала – chcp.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main() {
    char r, k;
    FILE* out = fopen("out.txt", "w");
    if (!out)
    {
        perror("input");
        exit(-42);
    }
    for (int i = -128; i < 128; i++) {
        r = (char) i;
        fprintf(out, "%d %c\n", i, r);
        printf("%d  %c\n", i, r);
    }
    fclose(out);
    return 0;
}

Написал такое решение, правильное ли оно?


Ответы (1 шт):

Автор решения: Sergey

Написал такое решение, правильное ли оно?

На самом деле, вопрос достаточно сложный... Дело в том, что в Вашей программе предполагается однобайтовая кодировка символов. Т.н. "кодовая таблица".

Первая половина этой таблицы (символы с кодом до 127) является стандарной для любой национальной кодировки и называется ASCII таблицей. Но даже с ней есть проблемы, т.к. дале не все символы тут являются "печатаемыми", т.е. имеют графическое представление. Например, код 7 должен интерпретироваться как подача терминалом звукового сигнала ("Звонок"). Для разруливания таких проблем в стандартной библиотеки С есть функция int isprint(int c);

Символы, коды которых отрицательны, ложатся в верхнюю половину кодовой таблицы. Например, символ с кодом -1 (в 16-ричной кодировке 0xFF) является последним в кодовой таблице и в кодировке cp1251 означает букву 'я'. беда в том, что для кирицы существует несколько(!!!) кодовых таблиц, которые не совпадают: cp1251, cp866. KOI8-R и ещё более редкие.

Поэтому, не зря в задании спрашивается "Как меняется вывод в зависимости от выбранной кодировки?"

Но, на самом деле, эти вопросы уходят в историю. Сейчас, чаще всего, в компьютерных системах используется кодировка UTF8, которая отображается одинаково независимо ни от чего на всех компах с любыми ОС. Это относится, разумеется, ко всем линухам, макам и андроидам.

Я точно не уверен, но (насколько мне известно) даже мелкософты начали двигаться в этом направлении..

Так что это задание - анахронизм в значительной степени.

→ Ссылка