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

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

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

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

11.01.2012, 12:41. Просмотров 757. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2012, 12:41     Упражнение из книги.
Посмотрите здесь:

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

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

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

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

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

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

Упражнение - C++
Нужна помощь! Помогите решить упражнение, написав программы на языке С Написать функции для выполнения следующих операций: 1)...

Упражнение на строки - C++
Петя записался в кружок по программированию. На первом занятии Пете задали написать простую программу. Программа должна делать следующее: в...

Упражнение по рефакторингу - C++
Предлагаю Вашему вниманию пример кода. Мне бы хотелось узнать, какие бы шаги Вы предприняли для улучшения данного кода? Общий целевой...

Упражнение с использованием структуры - C++
Ребят помогите.На основе данных в input.txt составить список студентов группы включив в них следующие данные: фио, год рождения, домашний...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
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());
}
zeggel
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 3
11.01.2012, 13:21  [ТС]     Упражнение из книги. #3
Спасибо, разобрался. Не учел, что c_str() выделяет память.
Вариант с копированием для данной задачи больше подходит.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
11.01.2012, 19:27     Упражнение из книги. #4
c_str не выделяет память. c_str возвращает константный указатель на строку, которая хранится объекте типа std::string.
zeggel
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 3
12.01.2012, 00:11  [ТС]     Упражнение из книги. #5
Спасибо. Только начал разбираться с С++ и с указателями, путаница в голове.
Yandex
Объявления
12.01.2012, 00:11     Упражнение из книги.
Ответ Создать тему
Опции темы

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