Выделить память строго под вводимую строку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имею:
#include <stdio.h>
 
void main() {
  char c[100];
 
  gets(c);
  puts(c);
}
Ввел я строку меньше 100 байт. Понятно, что остальная выделенная память не используется. Подскажите, пожалуйста, как вводить строку любой длины (в разумных пределах, конечно). И чтобы память выделялась разумно – строго под введённые данные. Например, ввёл "abc", переменной "с" отводится 4 байта: 3 символа + \0 Например, ввёл "a", переменной "с" отводится 2 байта: 1 символ + \0 Может есть какая-то функция – тыкните ссылкой, пожалуйста.

Решение задачи: «Выделить память строго под вводимую строку»

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;
}

Объяснение кода листинга программы

  1. Подключение заголовочного файла для работы с функциями и структурами библиотеки GLib.
  2. Объявление функции main() — точки входа в программу.
  3. Объявление переменной типа char* str; для хранения строки вводимой пользователем.
  4. Объявление переменной типа GError* err; для обработки ошибок.
  5. Открытие файла stdin с помощью функции g_io_channel_unix_new(0).
  6. Проверка на успешное открытие файла, иначе вывод ошибки с помощью функции g_error().
  7. В цикле while считываем строку посимвольно с помощью функции g_io_channel_read_line(inp, &str, NULL, NULL, &err) до тех пор пока не будет введен символ новой строки.
  8. Выводим введенную строку с помощью функции g_print().
  9. Освобождаем память с помощью функции g_free().
  10. Если возникла ошибка, то выводим сообщение об ошибке с помощью функции g_error().
  11. Завершение программы с помощью оператора return 0;.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы