Необходимо записывать из консоли строку произвольного размера (условие конца строки нажатие Enter) без использования стандартного класса string и ввода cin. Т. е. размер строки до ее получения не известен, а сама строка может содержать пробелы.
Подскажите как это можно реализовать или хотя бы, где об этом почитать
Другие языки программирования и технологии
Как на c++ реализовать прием строки произвольного размера из консоли?
Использованием средств чистого С с посимвольным вводом и функцией realloc. А в перспективе дойдет до самодельного класса string.
Читать по одному символу при помощи getchar() до тех пор, пока не придёт EOF или перевод строки.
Важно, что getchar возвращает int, а не char.
Важно, что getchar возвращает int, а не char.
На самом деле начинать надо с того, что определить, что такое в данном случае "консоль", потому что решение задачи может различаться.
Если "консоль" - это буферизированный объект/поток, типа stdin или FILE из stdio.h, то прямое решение "в лоб" - это читать из потока при помощи функций для посимвольного чтения, как вам предложили выше. С точки зрения быстродействия это не оптимальное решение, но его совсем просто реализовать. Однако благодаря тому, что потоки ввода буферизированы, мы с таким же успехом можем использовать для чтения функцию fgets, которая вместо одного символа читает сразу много - либо всю строку целиком, либо сколько влезет в буфер, учитывая терминирующий '\0' Код реализации будет несколько сложнее, но работать все будет существенно быстрее. Если же консоль будет просто файловым дескриптором, то надо будет либо читать из него посимвольно при помощи read или чего-то подобного, либо приделывать к нему буферизацию (см например fdopen).
Для выделения памяти в обоих случаях лучше использовать не new а malloc/realloc, так как new выделит нам пустой массив, а realloc можно применить к существующему и есть неплохая вероятность, что внутри функции даже не потребуется перераспределять память. Но тут есть одна особенность, которую надо учитывать: память, выделенная при помощи new у нас освобождается при помощи delete, а память, выделенная при помощи malloc/realloc освобождается при помощи free. Поэтому идея после завершения работы функции и считывания строки просто вернуть выделенный кусок памяти с этой строкой - она чревата тем, что блок памяти попытаются освободить не так, как положено. Чем это кончится в каждом конкретном случае мне не известно, но хорошего точно будет мало. Поэтому ИМХО имеет смысл завернуть этот кусок памяти в класс, в деструкторе которого прописать правильное его удаление.
Если "консоль" - это буферизированный объект/поток, типа stdin или FILE из stdio.h, то прямое решение "в лоб" - это читать из потока при помощи функций для посимвольного чтения, как вам предложили выше. С точки зрения быстродействия это не оптимальное решение, но его совсем просто реализовать. Однако благодаря тому, что потоки ввода буферизированы, мы с таким же успехом можем использовать для чтения функцию fgets, которая вместо одного символа читает сразу много - либо всю строку целиком, либо сколько влезет в буфер, учитывая терминирующий '\0' Код реализации будет несколько сложнее, но работать все будет существенно быстрее. Если же консоль будет просто файловым дескриптором, то надо будет либо читать из него посимвольно при помощи read или чего-то подобного, либо приделывать к нему буферизацию (см например fdopen).
Для выделения памяти в обоих случаях лучше использовать не new а malloc/realloc, так как new выделит нам пустой массив, а realloc можно применить к существующему и есть неплохая вероятность, что внутри функции даже не потребуется перераспределять память. Но тут есть одна особенность, которую надо учитывать: память, выделенная при помощи new у нас освобождается при помощи delete, а память, выделенная при помощи malloc/realloc освобождается при помощи free. Поэтому идея после завершения работы функции и считывания строки просто вернуть выделенный кусок памяти с этой строкой - она чревата тем, что блок памяти попытаются освободить не так, как положено. Чем это кончится в каждом конкретном случае мне не известно, но хорошего точно будет мало. Поэтому ИМХО имеет смысл завернуть этот кусок памяти в класс, в деструкторе которого прописать правильное его удаление.
Похожие вопросы
- как отформатировать жёский диск "C" через командную строку?
- [C++] Как поменять строки местами в двумерном статистическом массиве размерами N1xN2?
- Как в C# скрыть ввод и вывод данных в консоль?
- C# Как перевернуть строку?
- Скажите пожалуйста как в C++ копировать часть строки?
- Помогите решить задачу C++. Найти номер строки, для которой среднее арифметическое значение ее элементов максимальна
- C++, надо вывести строку только с 1 пробелом вместо нескольких
- Упорядочить по возрастанию элементы каждой строки матрицы размером n х n.
- C++ проблемма русификации консоли. не могу сделать чтобы консоль была русской
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .