Тип char* без ограничения на длину строки для хранения любых символов - C (СИ)
Формулировка задачи:
Как можно определить char* таким образом, что бы длина его была равна строке из стандартного входного потока и что бы туда можно было положить любые символы хоть китайские иероглифы
Было хорошо если ещё была возможность определить кодировку
Вроде есть ограничение на коды символов для типа char -127/127. Думаю могут быть символы числа которых выходят за эти рамки. Как работать с такими строками? Или это исключено?
Решение задачи: «Тип char* без ограничения на длину строки для хранения любых символов»
textual
Листинг программы
char *fgm(FILE *f) // * Чтение строки с выделением памяти 1991 { char *b; int c, j=0, l=81; if (f==NULL || feof(f)) return(NULL); b = malloc(l); a: c = getc(f); if (c=='\n' || c==EOF) { b[j++] = '\0'; if (j!=l) b = realloc(b,j); return(b); } if (j >= l-1) { l += 80; b = realc(b,l); } b[j++] = c; goto a; }
Объяснение кода листинга программы
- Функция
fgm
принимает в качестве аргумента файловый указательf
и возвращает указатель на строку, прочитанную из файла. - Если файловый указатель
f
равенNULL
или достигнут конец файла (feof(f)
), функция возвращаетNULL
. - Функция выделяет память под строку, используя функцию
malloc
, размер которой определяется переменнойl
(81 байт). - Происходит чтение символа из файла с помощью функции
getc(f)
, и этот символ сохраняется в переменнуюc
. - Если символ является символом новой строки (
'\n'
), символом конца файла (EOF
) или если достигнут предел выделенной памяти, то есть еслиj
равноl
, то выполняется блок кода:- Символ
'\0'
добавляется в строку по индексуj
. - Если
j
не равноl
, то память под строку увеличивается с помощью функцииrealloc
, и указатель на строку обновляется соответственно. - Функция возвращает указатель на строку.
- Символ
- Если символ не является символом новой строки, символом конца файла или если не достигнут предел выделенной памяти, то в переменную
b
записывается значениеc
, а переменнаяj
увеличивается на 1. - Затем происходит переход к шагу 4.
- Если достигнут предел выделенной памяти, то размер памяти увеличивается на 80 байт с помощью функции
realloc
, и указатель на строку обновляется соответственно. - Значение
c
сохраняется в переменнуюb
по индексуj
, а переменнаяj
увеличивается на 1. - Происходит переход к шагу 4.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д