Форум программистов, компьютерный форум CyberForum.ru

Считывание в массив char с консоли - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.64
Undrei
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 3
13.10.2012, 23:52     Считывание в массив char с консоли #1
не выходит считать массив чаров, после перевода строки консоль не закрывается, а просто переходит на др. строку и никак не реагирует, либо можно дальше вводить любые символы и сколько угодно переводить строки.

C++
1
2
3
4
5
6
7
i=0;
 
 char* S = new char[i];
 do {
 S[i] = getchar(); // так же пробовал cin.get(); пробовал строки и cin.getline(); не могу понять в чем ошибка.
 i++;
 } while (S[i-1] != '\n');
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
14.10.2012, 00:13     Считывание в массив char с консоли #2
Цитата Сообщение от Undrei Посмотреть сообщение
i=0; char* S = new char[i];
у вас массив из 0 элементов, простите, он вы куда записываете значения то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
using namespace std;
 
int main(){
    setlocale(LC_ALL, "");
    const int SIZE = 100;
    char str[SIZE];
 
    cout << "Пожалуйста введите строку:\n";
    cin.get(str, SIZE);
    cout << "Вы ввели строку: " << str << endl;
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 00:35     Считывание в массив char с консоли #3
Уверены, что не считывает? А если так посмотреть?:
C++
1
2
3
4
5
6
7
8
9
int i= 0;
 char* S = new char[i];
 do 
 {
    S[i] = getchar(); 
    cout << S[i];
    if (S[i] == '\n') break;
    i++;
 } while (true);
Хотя нужно, как посоветовал panicwassano, объявить массив достаточного размера.
Undrei
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 3
14.10.2012, 19:03  [ТС]     Считывание в массив char с консоли #4
panicwassano: динамический массив, сам под нужный размер подойдет вроде.

alsav22: спасибо, не сделал вывод для проверки ) оказалось, что результат bool функции не выводился, вроде все нормально, но все равно не выходит из консоли, но это уже дальше разбираться пойду.


p.s. нужен именно динамический, т.к. длина строки по задаче не известна, а лишнюю память байт в 100 грузить не нужно думаю. к тому же может не хватить заданного размера.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 07:15     Считывание в массив char с консоли #5
Цитата Сообщение от Undrei Посмотреть сообщение
panicwassano: динамический массив, сам под нужный размер подойдет вроде.
Совершенно нет. Это только объекты с автоматическим управлением памятью могут память под себя подгонять. Динамический - это массив, который создаётся в специальной области памяти (куче), не во время компиляции (как статические массивы), а во время выполнения программы (отсюда и название). Размер его, конечно, тоже нужно задавать (в отличие от статических массивов, размер может быть задан неконстантной переменной, во время исполнения кода). Пример я свой привёл только для того, чтобы показать, что запись в память происходит. Но, так как в С++, нет контроля выхода за пределы массива, то такая запись затирает данные, лежащие в памяти рядом с массивом. Так делать не нужно.

Добавлено через 22 минуты
Цитата Сообщение от Undrei Посмотреть сообщение
p.s. нужен именно динамический, т.к. длина строки по задаче не известна
Тут нужный размер делается так: берётся размер строки и создаётся динамический массив под этот размер. Например:
C++
1
2
3
4
5
6
7
8
9
cout << "Enter to string: ";
  
char *t = new char[255]; // на время выделяется память (с запасом) под строку 
cin.getline(t, 255); // чтение строки
 
char *s = new char[strlen(t) + 1]; // выделяется новая память под размер введённой строки
strcpy(s, t); // копируется строка в новую память
  
delete [] t; // ненужная память освобождается
Undrei
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 3
15.10.2012, 13:32  [ТС]     Считывание в массив char с консоли #6
Тут нужный размер делается так: берётся размер строки и создаётся динамический массив под этот размер. Например:
C++
1
2
3
4
5
6
7
8
9
cout << "Enter to string: ";
  
char *t = new char[255]; // на время выделяется память (с запасом) под строку 
cin.getline(t, 255); // чтение строки
 
char *s = new char[strlen(t) + 1]; // выделяется новая память под размер введённой строки
strcpy(s, t); // копируется строка в новую память
  
delete [] t; // ненужная память освобождается
Спасибо, сделаем так.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.10.2012, 13:45     Считывание в массив char с консоли #7
Только не забудьте, после того, как строка уже не будет нужна, сделать:
C++
1
delete [] s;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 21:41     Считывание в массив char с консоли
Еще ссылки по теме:

Из С в C++, считывание с консоли в цикле C++
Считывание файлов и консоли с++ C++
C++ Считывание данных из консоли

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

Или воспользуйтесь поиском по форуму:
Karmisha
2 / 2 / 1
Регистрация: 04.07.2013
Сообщений: 27
04.04.2014, 21:41     Считывание в массив char с консоли #8
Цитата Сообщение от panicwassano Посмотреть сообщение
#include <iostream>
using namespace std;
int main(){
* * setlocale(LC_ALL, "");
Можно просто вместо LC_ALL поставить 0 так... для себя )
Yandex
Объявления
04.04.2014, 21:41     Считывание в массив char с консоли
Ответ Создать тему
Опции темы

Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru