Выделить память строго под вводимую строку - C (СИ)
Формулировка задачи:
Имею:
Ввел я строку меньше 100 байт. Понятно, что остальная выделенная память не используется.
Подскажите, пожалуйста, как вводить строку любой длины (в разумных пределах, конечно). И чтобы память выделялась разумно – строго под введённые данные.
Например, ввёл "abc", переменной "с" отводится 4 байта: 3 символа + \0
Например, ввёл "a", переменной "с" отводится 2 байта: 1 символ + \0
Может есть какая-то функция – тыкните ссылкой, пожалуйста.
#include <stdio.h>
void main() {
char c[100];
gets(c);
puts(c);
}Решение задачи: «Выделить память строго под вводимую строку»
textual
Листинг программы
#include <glib.h>
int main(void) {
char * str;
GError * err = NULL;
GIOChannel * inp;
inp = g_io_channel_unix_new(0);
if ( ! inp )
g_error("Can't get channel to stdin\n");
while ( g_print("String: "), g_io_channel_read_line(inp, &str, NULL, NULL, &err) == G_IO_STATUS_NORMAL && *str != '\n' ) {
g_print("You have entered: %s", str);
g_free(str);
}
if ( err )
g_error("%s\n", err->message);
return 0;
}
Объяснение кода листинга программы
- Подключение заголовочного файла
для работы с функциями и структурами библиотеки GLib. - Объявление функции main() — точки входа в программу.
- Объявление переменной типа char* str; для хранения строки вводимой пользователем.
- Объявление переменной типа GError* err; для обработки ошибок.
- Открытие файла stdin с помощью функции g_io_channel_unix_new(0).
- Проверка на успешное открытие файла, иначе вывод ошибки с помощью функции g_error().
- В цикле while считываем строку посимвольно с помощью функции g_io_channel_read_line(inp, &str, NULL, NULL, &err) до тех пор пока не будет введен символ новой строки.
- Выводим введенную строку с помощью функции g_print().
- Освобождаем память с помощью функции g_free().
- Если возникла ошибка, то выводим сообщение об ошибке с помощью функции g_error().
- Завершение программы с помощью оператора return 0;.