63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Считать строку с консоли

18.09.2014, 10:13. Показов 12704. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
такая задачка, препод хочет чтобы мы не юзали класс string, а юзали массивы символов, причем только динамические (лаба такая просто), запретил выделять буфер (например char* str = new char[100]), так как же мне считать строку с консоли??? читать посимвольно с помощью cin.get и каждый раз перевыделять память на 1 символ? или может есть какая то специальная функция для такого случая?

Добавлено через 1 минуту
потому что getline вроде бы требует задать количество считываемых символов, а я не знаю сколько их будет...

Добавлено через 48 секунд
хотя вот со string я бы сделал так: getline(cin, str) и оно канает, может можно и с массивом как то так заюзать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2014, 10:13
Ответы с готовыми решениями:

Считать строку из консоли
Как в с++ получить в виде строки то, что ответила система на команду. То есть если я, к примеру,...

Считать строку из консоли
Добрый день. Как правильно написать для считывания строки из консоли? Пишу так: #include...

Считать строку из консоли
Здравствуйте. Скажите, пожалуйста, как можно считать текст из консоли, завершающийся EOF? Хотел...

Как считать строку с консоли?
есть код, если раскоментить с 55-ой по 62-ую будет вылетать при первом же сеттере surname. как это...

30
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
18.09.2014, 18:40 21
Author24 — интернет-сервис помощи студентам
zss ну хоть строку вводи, выводи, в чем проблема.. другой вопрос, что скорее всего это не безопасно.. (хотя на сколько я помню new оперирует с "кучей"),
ПЫСЭ да и зачем вы все там поменяли.. смысл тоже поменялся

Добавлено через 8 минут
я имел ввиду использовать "char* i = new char;" а не "char* i = new char[N];"
но работать с переменной i как с массивом char, во всяком случае, изначальной код что я скинул у меня пашет (в иострим о печатался) и в указатель i сливается вся строка...

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
int main()
{
   char *str = new char;
   cin>>str;
   cout << str << endl; 
   delete [] str;
   return 0;
}
вот что я имел ввиду http://ideone.com/fork/VFEHpM, жмите "Run"
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
18.09.2014, 20:36 22
Цитата Сообщение от GetHelp Посмотреть сообщение
препод хочет чтобы мы не юзали класс string, а юзали массивы символов, причем только динамические (лаба такая просто), запретил выделять буфер (например char* str = new char[100])
а как звучал этот запрет? Просто я все больше и больше склоняюсь к мысли, что задание было наподобие такого: считать посимвольно в массив строку с консоли, нет?
Цитата Сообщение от worldown Посмотреть сообщение
вот что я имел ввиду http://ideone.com/fork/VFEHpM, жмите "Run"
а что мы там должны увидеть, собственно? Ошибку сегментации?
0
18775 / 9786 / 2394
Регистрация: 30.01.2014
Сообщений: 17,177
18.09.2014, 20:45 23
Цитата Сообщение от KOPOJI Посмотреть сообщение
а что мы там должны увидеть, собственно?
Увидим неопределенное поведение
0
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
19.09.2014, 03:04 24
Да, возможно он не надежен, но и в условии ничего не сказанно о надежности.. лишь предложел некий выход из ситуации, для исполнения каприза препода,..И поверьте это работает. )) а что предложили вы?? только умничать горазды. С уважением.
0
Модератор
Эксперт CЭксперт С++
5283 / 2370 / 342
Регистрация: 20.02.2013
Сообщений: 5,769
Записей в блоге: 20
19.09.2014, 07:28 25
Цитата Сообщение от GetHelp Посмотреть сообщение
юзать в функции 2 раза return это преступление, за него надо руки отрубать -_-
Страуструпу тогда тоже руки отрубите:
Цитата Сообщение от Бьярне Страуструп
2.3.2. Операторы ветвления и циклы
Язык C++ обеспечивает общепринятый набор операторов ветвления и цикла.
Для примера рассмотрим функцию, выводящую приглашение к вводу и
возвращающую булевское (логическое) значение, зависящее от ввода пользователя:
C++
1
2
3
4
5
6
7
8
bool accept () 
{ 
    cout << "Do you want to proceed {y or n) ? \n"; // вывести вопрос 
    char answer = 0; 
    cin >> answer; //считать ответ 
    if (answer == 'y' ) return true; 
    return false; 
}
P.S. Практически в каждой теме, в которой люди Вам совершенно бескорыстно помогают, Вы им беспардонно грубите.
Это у Вас так благодарность проявляется?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
19.09.2014, 10:10 26
Цитата Сообщение от worldown Посмотреть сообщение
Да, возможно он не надежен, но и в условии ничего не сказанно о надежности
Ну да, правильно) Об этом обычно не упоминают, значит можно везде лепить код на "авось сработает", железно
Цитата Сообщение от worldown Посмотреть сообщение
а что предложили вы??
предложил уточнить задание:
Цитата Сообщение от KOPOJI Посмотреть сообщение
а как звучал этот запрет? Просто я все больше и больше склоняюсь к мысли, что задание было наподобие такого: считать посимвольно в массив строку с консоли, нет?
Цитата Сообщение от worldown Посмотреть сообщение
только умничать горазды........С уважением
Имхо, это две взаимоисключающие фразы
gru74ik, думаю, что в данном случае это просто для более понятного кода. Практически на 100% уверен, что сам Страуструп, если бы писал такую программу не для книги, а вообще, написал бы как-то так:
C++
1
return answer == 'y';
Добавлено через 2 минуты
а вот еще несколько примеров с множественными возвратами Определить, является ли натуральное число n степенью числа 3
0
IrineK
19.09.2014, 14:20
  #27

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
препод хочет чтобы мы не юзали класс string
Цитата Сообщение от GetHelp Посмотреть сообщение
юзать в функции 2 раза return это преступление
Цитата Сообщение от GetHelp Посмотреть сообщение
юзали массивы символов, причем только динамические (лаба такая просто), запретил выделять буфер
Преп - Дугин от программирования, и ученики - достойные.

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
20.09.2014, 19:01  [ТС] 28
Цитата Сообщение от IrineK Посмотреть сообщение
Возможно, нужно писать в православном С. Тогда память выделяется malloc.
нет...
Цитата Сообщение от KOPOJI Посмотреть сообщение
По вашему, надо обязательно так, да?
да именно так
Цитата Сообщение от KOPOJI Посмотреть сообщение
а как звучал этот запрет? Просто я все больше и больше склоняюсь к мысли, что задание было наподобие такого: считать посимвольно в массив строку с консоли, нет?
нет, смысл вообще не в работе со строками, а в классах, просто препод придрался, а я педант =)
Цитата Сообщение от gru74ik Посмотреть сообщение
P.S. Практически в каждой теме, в которой люди Вам совершенно бескорыстно помогают, Вы им беспардонно грубите.
Это у Вас так благодарность проявляется?
это не была грубость имхо, я лишь указал что такое построение кода в корни неверно, во всяком случае меня так учили...
Цитата Сообщение от IrineK Посмотреть сообщение
Преп - Дугин от программирования, и ученики - достойные.
шта?? ниче не понял -_-

вот короче в итоге я извратился так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char* GetString()
{
    char* str = new char;
    size_t length = 1;
    while ((str[length - 1] = getchar()) != '\n')
    {
        char* tmp = new char[length];
        memcpy(tmp, str, length);
        delete[] str;
        str = new char[length + 1];
        memcpy(str, tmp, length++);
        delete[] tmp;
    }
    str[length - 1] = 0;
    return str;
}
Добавлено через 34 минуты
так теперь еще вопросы возникли:
1. getchar - не из плюсов, желательно ее заменить на что то более плюсовое... кто нибудь знает какой то аналог на плюсах? я знаю только cin.get, но он ждет нажатия, а мне нужно чтобы считывалось посимвольно после enter-а как в getchar... можно конечно попробовать накидать аналог getchar на плюсах, но может есть что то готовое?
2. мне там дальше надо сделать аналогичное считывание из текстового файла (т.е. также до '\n'), можно ли как то приспособить мою функцию для этого? ну скажем передавать в нее параметром какой то общий объект обозначающий поток ввода будь то консоль или файл... что то типа iostream и его потом юзать при считывании символов... т.е. чтобы не писать 2 функции для консоли и файла
0
IrineK
20.09.2014, 20:11
  #29

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
можно конечно попробовать накидать аналог getchar на плюса
Точно, секта.

0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.09.2014, 20:36 30
Лучший ответ Сообщение было отмечено GetHelp как решение

Решение

Цитата Сообщение от GetHelp Посмотреть сообщение
getchar - не из плюсов, желательно ее заменить на что то более плюсовое...
C++
1
2
3
4
5
6
std::istream& in = std::cin;
char tmp;
while(in.get(tmp))
{
    //......
}
Цитата Сообщение от GetHelp Посмотреть сообщение
мне там дальше надо сделать аналогичное считывание из текстового файла
не понял, чем не устраивает работа со строкой std::string, а не посимвольно. Но если надо - читайте также посимвольно с помощью in.get(char)
Цитата Сообщение от GetHelp Посмотреть сообщение
т.е. чтобы не писать 2 функции для консоли и файла
нечто такое, что ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
 
void outputChar(std::istream& in)
{
    char tmp;
    while(in.get(tmp) && tmp != '\n')
        std::cout << tmp << std::endl;
    std::cout << "End of line" << std::endl;
}
int main(int argc, char *argv[])
{
    std::istream& console = std::cin;
    std::fstream file("./file.txt");
    
    outputChar(file);
    outputChar(console);
    
    file.close();
}
Добавлено через 4 минуты

Не по теме:

какой ужасный код, все же, получился.. Ну, может, кто поправит на "как надо"

1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
20.09.2014, 20:47  [ТС] 31
Цитата Сообщение от KOPOJI Посмотреть сообщение
C++
1
2
3
4
5
6
std::istream& in = std::cin;
char tmp;
while(in.get(tmp))
{
    //......
}
вооо спс не знал про такую перегрузку
Цитата Сообщение от KOPOJI Посмотреть сообщение
не понял, чем не устраивает работа со строкой std::string, а не посимвольно. Но если надо - читайте также посимвольно с помощью in.get(char)
ограничение лабы
Цитата Сообщение от KOPOJI Посмотреть сообщение
нечто такое, что ли?
да, спасибо все работает ^_^

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char* GetString(istream& stream)
{
    char* str = new char;
    size_t length = 1;
    while ((stream.get(str[length - 1])) && (str[length - 1] != '\n'))
    {
        char* tmp = new char[length];
        memcpy(tmp, str, length);
        delete[] str;
        str = new char[length + 1];
        memcpy(str, tmp, length++);
        delete[] tmp;
    }
    str[length - 1] = 0;
    return str;
}
Добавлено через 2 минуты
Цитата Сообщение от KOPOJI Посмотреть сообщение
C++
1
2
std::istream& console = std::cin;
outputChar(console);
кстати можно передавать просто cin
0
20.09.2014, 20:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2014, 20:47
Помогаю со студенческими работами здесь

Считать посимвольно строку из консоли
Добрый день! Необходимо в программе организовать считывание длинной строки из консоли. Строка...

Можно ли считать с консоли строку по шаблону?
например, scanf можно считать число и записать в переменную. int n; scanf(&quot;%d&quot;, &amp;n); а...

Каким образом нормально считать с консоли строку?
Дело в том что необходимо считывать строки вводимые с консоли. Но полноценно это не выходит. Ф-ция...

Считать строку с консоли (из файла). Найти количество знаков препинания в строке
Считать строку с консоли (из файла). Найти количество знаков препинания в строке.Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru