Перераспределение памяти в отдельной функции - C (СИ)

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

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

Добрый день! Имею некое недопонимание с указателями/адресами в C/C++. Имеется некий код:
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
 
void getStr(char** str)
{
    if(*str != NULL)
        free(*str);
    *str = (char*)malloc(1);
    char buf = 0;
    *str[0] = '\0';
 
    int i = 1;
    for (i = 1; 1; i++)
    {
        
        fflush(stdin);
        buf = getch();
        
        if (buf == 13)
            break;
        
        *str = (char*)realloc(*str, i + 1 * sizeof(char));
        *str[i - 1] = buf; 
        *str[i] = '\0';
        
        system("cls");
        printf("%s\n", *str);
    }
}
 
int main(int argc, char *argv[])
{
    char* str = NULL;
    getStr(&str);
    
    printf("%s\n", str);
    system("pause");
 
    free(str);
 
    return 0;
}
Думаю его суть ясна (пока не нажата клавиша Enter - перераспределяем память и записываем 1 элемент). Так вот подскажите пожалуйста как мне правильно вызвать функцию чтобы мои результаты сохранились и работа с памятью осуществлялась корректно. Ну а в идеале посоветуйте статью которая ИСЧЕРПЫВАЮЩЕ описывала все нюансы. Знаю что в C++ можно сделать так:
void foo(char*& str)
Спасибо!

Решение задачи: «Перераспределение памяти в отдельной функции»

textual
Листинг программы
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
 
void fillStr(char** str)
{
    (*str)= (char*)realloc((*str), 1);
    
    char buf = 0;
    (*str)[0] = '\0';
 
    int i = 1;
    for (i = 1; 1; i++)
    {
 
        fflush(stdin);
        buf = _getch();
 
        if (buf == 13)
            break;
 
        (*str) = (char*)realloc((*str), i + 1 * sizeof(char));
        (*str)[i - 1] = buf;
        (*str)[i] = '\0';
 
        system("cls");
        printf("%s\n", (*str));
    }
}
 
int main()
{
    char* str = 0;
    
    fillStr(&str);
    
    printf("%s\n", str);
    
    if(str)
    free(str);
    str = 0;
    
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы с памятью и вводом-выводом

    include

    include

    include

  2. Определяем функцию fillStr, которая принимает указатель на строку и заполняет её вводом с клавиатуры void fillStr(char* str) { // Выделяем память под строку (str)= (char)realloc((str), 1); (str)[0] = '\0'; // Заполняем строку символами, пока не будет введен символ новой строки int i = 1; for (; i; i++) { // Сбрасываем буфер ввода fflush(stdin); // Получаем символ из ввода char buf = _getch(); // Если введен символ новой строки, выходим из цикла if (buf == 13) break; // Выделяем память под новый символ (str) = (char)realloc((str), i + 1 sizeof(char)); // Записываем символ в строку (str)[i - 1] = buf; // Выводим строку на экран printf(%s\n, (*str)); } }
  3. Определяем основную функцию программы int main() { // Инициализируем указатель на строку char* str = 0; // Заполняем строку с помощью функции fillStr fillStr(&str); // Выводим строку на экран printf(%s\n, str); // Освобождаем память, выделенную под строку if(str) free(str); // Сбрасываем указатель на ноль str = 0; // Завершаем программу return 0; }

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


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

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

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