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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zeggel
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 3
#1

Упражнение из книги. - C++

11.01.2012, 12:41. Просмотров 770. Ответов 4
Метки нет (Все метки)

В книге (Язык программирования С++. Вводный курс. 4-е изд. (Стенли Липпман)[2007]) есть задание:
"Напишите программу, читающую строки в вектор. Скопируйте этот вектор в массив указателей на тип char. Для каждого элемента вектора создайте новый символьный массив и скопируйте данные из элемента вектора в этот символьный массив. Затем поместите указатель на символьный массив в массив символьных указателей.
Отобразите содержимое вектора и массива, созданного в предыдущем упражнении. После отображения не забудьте удалить символьные массивы."

В моем решении интересует 16 строка - с ней и без неё вывод программы одинаковый. Как правильно с этой строкой или без?

Моё решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
//#include <cstring>
#include <string>
#include <vector>
using namespace std;
 
int main(){
    
    string s;
    vector<string> vs;
    while(cin>>s)
        vs.push_back(s);
    
    const char **arr=new const char*[vs.size()];
    for(vector<string>::size_type i=0; i<vs.size(); ++i){
        //arr[i]=new char[vs[i].length()];
        arr[i]=vs[i].c_str();
    }
    
    for(vector<string>::size_type i=0; i<vs.size(); i++){
        cout<<"Vector: "<<vs[i]<<" Array: "<<arr[i]<<endl;
        delete [] arr[i];
    }
        
    delete [] arr;
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2012, 12:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Упражнение из книги. (C++):

Упражнение из книги Лафоре - C++
//11.cpp #include &lt;iostream&gt; using namespace std; class sterling { private: long pounds; int shil; int pens;

Упражнение №8 глава 5 из книги Страуструпа - C++
Здравствуйте. Помогите решить задание. Напишите программу,считывающую ряд чисел и записывающую их в vector&lt;int&gt;.После того как...

Создание класса (упражнение из книги Дейтелов) - C++
В книге Дейтелов в разделе &quot;Упражнения&quot; есть такое задание: &quot;Создайте класс с именем Account, которым мог бы воспользоваться банк для...

Упражнение для программы калькулятор из книги Язык программирования С++ - C++
Здравствуйте. Вот упражнение и калькулятор из книги Страуструпа. Не могли бы вы объяснить мне, как ввести в калькулятор функцию sin() ?...

Решить упражнение на файловый ввод/вывод из книги Лафоре (12 глава) - C++
Доброго времени суток. В очередной раз обращаюсь за советом касательно разъяснения задачи Понимаю типы ifstream, ofstream как...

Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре - C++
Доброго времени суток господа. Подскажите пожалуйста каким образом можно объединить классы? Почему при создание объекта ship в main выдает...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
11.01.2012, 13:08 #2
Здесь
C++
1
const char **arr=new const char*[vs.size()];
вы выделяете память под массив указателей из vs.size() элементов.
а здесь
C++
1
arr[i]=vs[i].c_str();
присваиваете i-тому элементу массива указателй адрес существующей строки память под которую уже выделил класс std::string. Следовательно
C++
1
arr[i]=new char[vs[i].length()];
в данном случае делать не нужно(и delete [] arr[i]; следующем цикле тоже).
P.S. если вам нужна копия строки из вектора, то следовало бы сделать так
C++
1
2
3
4
for(vector<string>::size_type i=0; i<vs.size(); ++i){
    arr[i]=new char[vs[i].length() + 1]; // +1 символ под '\0'    
    std::strcpy(arr[i], vs[i].c_str());
}
1
zeggel
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 3
11.01.2012, 13:21  [ТС] #3
Спасибо, разобрался. Не учел, что c_str() выделяет память.
Вариант с копированием для данной задачи больше подходит.
0
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
11.01.2012, 19:27 #4
c_str не выделяет память. c_str возвращает константный указатель на строку, которая хранится объекте типа std::string.
0
zeggel
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 3
12.01.2012, 00:11  [ТС] #5
Спасибо. Только начал разбираться с С++ и с указателями, путаница в голове.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2012, 00:11
Привет! Вот еще темы с ответами:

Упражнение из книги Страуструпа. Программа угадай число. Можно ли написать лучше? - C++
Всем привет. Сделал упражнение к книге Бьерна Страуструпа &quot;Программирование. Принципы и практика использования С++&quot;. Текст упражнения...

Упражнение из книги Страуструпа. Программа мини-калькулятор. Цифры записанные в строковом формате - C++
Привет всем. Не могу понять, как необходимо изменить программу исходя из условия упражнения. Упражнение сформулировано так: ...

Упражнение по программированию (Стивен Прата, глава 2, упражнение 3) - C++
2 Глава, вопрос 3. Напишите программу на С++, которая использует три определяемых пользователем функции (включая main()) и генерирует...

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги - C++
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги , название книги. Подсчитать , книги скольких...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.01.2012, 00:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru