Тип 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.