Вместе с текстом выводится мусор - C (СИ)
Формулировка задачи:
Здравствуйте дорогие товарищи. Я изучал С# и решил перейти на Си. Взял простенькую задачу из студенческого задачника. Суть задачи - обработка строки в реальном времени(дать возможность копипастить заданный интервал) Поскольку в Си нет такого типа переменной как string пришлось выкручиваться. И тут я столкнулся с проблемой, что не могу даже правильно вывести строку.
Вот код моей программы(самая основа)
Проблема в том, что на выходе я получаю следующее: (см. прикреплённые файлы)
1 строка - команда printf("Enter the string\n"); тут всё ясно.
2 строка - это то, что я вводил через метод read();
3 строка - это то, что выводится командой printf(str); (так же пробовал и printf("%s", str); ) . Я не могу понять, что за ерундовина приклеивается после "Hello World!" и как от неё избавиться. А главное, почему она прикрепляется туда. Буду очень благодарен.
Листинг программы
- #include "stdafx.h"
- #include <stdlib.h>
- char* str = (char*)malloc(sizeof(char));
- int size = 1;
- int used = 0;
- void read()//чтение строки с клавиатуры
- {
- for (int i = getchar(); i != 10; i = getchar())
- {
- if (used == size)
- {
- size++;
- str = (char*)realloc(str, sizeof(char) * size);
- }
- str[used++] = i;
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- printf("Enter the string\n");
- read();
- printf(str);
- printf("\n");
- getchar();
- return 0;
- }
Решение задачи: «Вместе с текстом выводится мусор»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- char* read() {
- char* str = malloc(sizeof(char));
- size_t size = 0;
- int ch;
- while ((ch = getchar()) != '\n') {
- // +1 для резервирования места ещё и под '\0' символ
- str = realloc(str, sizeof(char) * (++size + 1));
- str[size - 1] = ch;
- }
- // Закрываем строку
- str[size] = '\0';
- return str;
- }
- int main() {
- printf("Enter the string\n");
- char* str = read();
- printf("%s\n", str);
- free(str);
- system("pause");
- return 0;
- }
Объяснение кода листинга программы
- Вместе с текстом выводится мусор - это может быть связано с тем, что в конце программы не было добавлено освобождение памяти, выделенной под строку. В данном случае, после вызова функции
free(str);
, память будет освобождена и мусор выводиться не будет. - В функции
read()
используется функцияmalloc(sizeof(char));
для выделения памяти под строку. При этом, вначале выделяется память под один символ, а затем она расширяется при помощи функцииrealloc()
. Это сделано для того, чтобы избежать выделения излишней памяти в случае, если строка окажется короткой. - В функции
main()
используется функцияprintf(
%s\n, str);
для вывода содержимого строкиstr
. При этом,%s
- это спецификатор формата, который указывает на то, что нужно вывести строку. - Функция
read()
считывает ввод пользователя до тех пор, пока не будет введен символ новой строки (\n
). Это делается с помощью циклаwhile
, в котором используется функцияgetchar()
. - В функции
main()
используется функцияsystem(
pause);
для приостановки выполнения программы до тех пор, пока пользователь не нажмет любую клавишу. Это позволяет пользователю увидеть вывод программы перед ее завершением.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д