Вместе с текстом выводится мусор - C (СИ)

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

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

Здравствуйте дорогие товарищи. Я изучал С# и решил перейти на Си. Взял простенькую задачу из студенческого задачника. Суть задачи - обработка строки в реальном времени(дать возможность копипастить заданный интервал) Поскольку в Си нет такого типа переменной как string пришлось выкручиваться. И тут я столкнулся с проблемой, что не могу даже правильно вывести строку. Вот код моей программы(самая основа)
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. char* str = (char*)malloc(sizeof(char));
  4. int size = 1;
  5. int used = 0;
  6. void read()//чтение строки с клавиатуры
  7. {
  8. for (int i = getchar(); i != 10; i = getchar())
  9. {
  10. if (used == size)
  11. {
  12. size++;
  13. str = (char*)realloc(str, sizeof(char) * size);
  14. }
  15. str[used++] = i;
  16. }
  17. }
  18. int _tmain(int argc, _TCHAR* argv[])
  19. {
  20. printf("Enter the string\n");
  21. read();
  22. printf(str);
  23. printf("\n");
  24. getchar();
  25. return 0;
  26. }
Проблема в том, что на выходе я получаю следующее: (см. прикреплённые файлы) 1 строка - команда printf("Enter the string\n"); тут всё ясно. 2 строка - это то, что я вводил через метод read(); 3 строка - это то, что выводится командой printf(str); (так же пробовал и printf("%s", str); ) . Я не могу понять, что за ерундовина приклеивается после "Hello World!" и как от неё избавиться. А главное, почему она прикрепляется туда. Буду очень благодарен.

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char* read() {
  5.     char* str = malloc(sizeof(char));
  6.     size_t size = 0;
  7.     int ch;
  8.  
  9.     while ((ch = getchar()) != '\n') {
  10.         // +1 для резервирования места ещё и под '\0' символ
  11.         str = realloc(str, sizeof(char) * (++size + 1));
  12.         str[size - 1] = ch;
  13.     }
  14.     // Закрываем строку
  15.     str[size] = '\0';
  16.  
  17.     return str;
  18. }
  19.  
  20. int main() {
  21.     printf("Enter the string\n");
  22.     char* str = read();
  23.     printf("%s\n", str);
  24.     free(str);
  25.     system("pause");
  26.     return 0;
  27. }

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

  1. Вместе с текстом выводится мусор - это может быть связано с тем, что в конце программы не было добавлено освобождение памяти, выделенной под строку. В данном случае, после вызова функции free(str);, память будет освобождена и мусор выводиться не будет.
  2. В функции read() используется функция malloc(sizeof(char)); для выделения памяти под строку. При этом, вначале выделяется память под один символ, а затем она расширяется при помощи функции realloc(). Это сделано для того, чтобы избежать выделения излишней памяти в случае, если строка окажется короткой.
  3. В функции main() используется функция printf(%s\n, str); для вывода содержимого строки str. При этом, %s - это спецификатор формата, который указывает на то, что нужно вывести строку.
  4. Функция read() считывает ввод пользователя до тех пор, пока не будет введен символ новой строки (\n). Это делается с помощью цикла while, в котором используется функция getchar().
  5. В функции main() используется функция system(pause); для приостановки выполнения программы до тех пор, пока пользователь не нажмет любую клавишу. Это позволяет пользователю увидеть вывод программы перед ее завершением.

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


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

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

10   голосов , оценка 4.1 из 5

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

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

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