Другие языки программирования и технологии

Как на c++ реализовать прием строки произвольного размера из консоли?

Необходимо записывать из консоли строку произвольного размера (условие конца строки нажатие Enter) без использования стандартного класса string и ввода cin. Т. е. размер строки до ее получения не известен, а сама строка может содержать пробелы.

Подскажите как это можно реализовать или хотя бы, где об этом почитать
Использованием средств чистого С с посимвольным вводом и функцией realloc. А в перспективе дойдет до самодельного класса string.
Cerg Www
Cerg Www
52 670
Лучший ответ
Читать по одному символу при помощи getchar() до тех пор, пока не придёт EOF или перевод строки.
Важно, что getchar возвращает int, а не char.
ВБ
Вова Белый
58 065
На самом деле начинать надо с того, что определить, что такое в данном случае "консоль", потому что решение задачи может различаться.
Если "консоль" - это буферизированный объект/поток, типа stdin или FILE из stdio.h, то прямое решение "в лоб" - это читать из потока при помощи функций для посимвольного чтения, как вам предложили выше. С точки зрения быстродействия это не оптимальное решение, но его совсем просто реализовать. Однако благодаря тому, что потоки ввода буферизированы, мы с таким же успехом можем использовать для чтения функцию fgets, которая вместо одного символа читает сразу много - либо всю строку целиком, либо сколько влезет в буфер, учитывая терминирующий '\0' Код реализации будет несколько сложнее, но работать все будет существенно быстрее. Если же консоль будет просто файловым дескриптором, то надо будет либо читать из него посимвольно при помощи read или чего-то подобного, либо приделывать к нему буферизацию (см например fdopen).
Для выделения памяти в обоих случаях лучше использовать не new а malloc/realloc, так как new выделит нам пустой массив, а realloc можно применить к существующему и есть неплохая вероятность, что внутри функции даже не потребуется перераспределять память. Но тут есть одна особенность, которую надо учитывать: память, выделенная при помощи new у нас освобождается при помощи delete, а память, выделенная при помощи malloc/realloc освобождается при помощи free. Поэтому идея после завершения работы функции и считывания строки просто вернуть выделенный кусок памяти с этой строкой - она чревата тем, что блок памяти попытаются освободить не так, как положено. Чем это кончится в каждом конкретном случае мне не известно, но хорошего точно будет мало. Поэтому ИМХО имеет смысл завернуть этот кусок памяти в класс, в деструкторе которого прописать правильное его удаление.