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

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

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

Добрый день! Имею некое недопонимание с указателями/адресами в C/C++. Имеется некий код:
Листинг программы
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <conio.h>
  4. void getStr(char** str)
  5. {
  6. if(*str != NULL)
  7. free(*str);
  8. *str = (char*)malloc(1);
  9. char buf = 0;
  10. *str[0] = '\0';
  11. int i = 1;
  12. for (i = 1; 1; i++)
  13. {
  14. fflush(stdin);
  15. buf = getch();
  16. if (buf == 13)
  17. break;
  18. *str = (char*)realloc(*str, i + 1 * sizeof(char));
  19. *str[i - 1] = buf;
  20. *str[i] = '\0';
  21. system("cls");
  22. printf("%s\n", *str);
  23. }
  24. }
  25. int main(int argc, char *argv[])
  26. {
  27. char* str = NULL;
  28. getStr(&str);
  29. printf("%s\n", str);
  30. system("pause");
  31. free(str);
  32. return 0;
  33. }
Думаю его суть ясна (пока не нажата клавиша Enter - перераспределяем память и записываем 1 элемент). Так вот подскажите пожалуйста как мне правильно вызвать функцию чтобы мои результаты сохранились и работа с памятью осуществлялась корректно. Ну а в идеале посоветуйте статью которая ИСЧЕРПЫВАЮЩЕ описывала все нюансы. Знаю что в C++ можно сделать так:
Листинг программы
  1. void foo(char*& str)
Спасибо!

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

textual
Листинг программы
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <conio.h>
  4.  
  5. void fillStr(char** str)
  6. {
  7.     (*str)= (char*)realloc((*str), 1);
  8.    
  9.     char buf = 0;
  10.     (*str)[0] = '\0';
  11.  
  12.     int i = 1;
  13.     for (i = 1; 1; i++)
  14.     {
  15.  
  16.         fflush(stdin);
  17.         buf = _getch();
  18.  
  19.         if (buf == 13)
  20.             break;
  21.  
  22.         (*str) = (char*)realloc((*str), i + 1 * sizeof(char));
  23.         (*str)[i - 1] = buf;
  24.         (*str)[i] = '\0';
  25.  
  26.         system("cls");
  27.         printf("%s\n", (*str));
  28.     }
  29. }
  30.  
  31. int main()
  32. {
  33.     char* str = 0;
  34.    
  35.     fillStr(&str);
  36.    
  37.     printf("%s\n", str);
  38.    
  39.     if(str)
  40.     free(str);
  41.     str = 0;
  42.    
  43.     return 0;
  44. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы