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

Запись вектора строк в массив указателей на тип char - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Программа по строкам http://www.cyberforum.ru/cpp-beginners/thread1042215.html
Вычислить арифметическое выражение, заданное в формате строки. Строка может содержать числа, а также операции сложения и вычитания. пример: 6+2-7+3. результат: 4 (sprintf и sscanf использовать нельзя!)
C++ По неведомой причине не работает программа Помогите исправить ошибку #include <clx.h> #pragma hdrstop #pragma argsused #include <iostream.h> #include <iomanip.h> #include <stdlib.h> #include <conio.h> typedef struct tree http://www.cyberforum.ru/cpp-beginners/thread1042214.html
Массив структур. Доступ к вложениям C++
Добрый день.Написал вот такой код для структур,но при компиляции выдает ошибки с оператором доступа(.).В чем дело,не пойму.Помогите пожалуйста. struct krama {struct monitor; struct key; struct mouse;}; struct krama all; struct monitor{
C++ Builder6 Найти номер минимального непарного элемента строки, у которого пятый элемент равняется последнему
Прошу помощи, осталось всего неделя до конца сессии(((( Дан массив R(8,8) Найти номер минимального непарного элемента строки, у которого пятый элемент равняется последнему.
C++ метод золотого сечения http://www.cyberforum.ru/cpp-beginners/thread1042191.html
Нашел на форуме прогу для оптимизации методом золотого сечения.Переделав ее под себя я не пойму вот этого for(i=-1;i<=1;i+=2).зачем вводить этот цикл?объясните пожалуйста.Вот и сам код: #include <stdio.h> #include <conio.h> #include <math.h> #include <locale.h> float f(float x) {return (0.983902)*x*x + (-0.069894)*x + (-0.074655);} int main(void) { int i,m=0;
C++ Эллипс спускается с горки и поднимается в другую Эллипс спускается с горки и поднимается в другую. Вот ссылка на картинку задания: http://webfile.ru/ce8074c574e6d68677c7b1eddb1c0ceb подробнее

Показать сообщение отдельно
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 15:29     Запись вектора строк в массив указателей на тип char
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс. 4-е изд.
Задание:
1) Напишите программу, читающую строки в вектор.
2) Скопируйте этот вектор в массив указателей на тип char.
Вообще там 4 задания, но у меня проблемы уже со 2м.
Да, задача довольно известная, и даже на этом форуме есть тема, в которой предложено решение.
Но я поставил себе 2 дополнительных условия.
1. Не использовать многомерные массивы (так как это только следующая тема в книге);
2. Не использовать индексацию на векторы и массивы, а использовать только итераторы и указатели.

Вот код функции main.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
vector<string> str_vec;           // вектор строк, введеных с клавиатуры
int main()
{   string s_temp;               // в данный момент исполняет функцию переменной текущей прочитанной строки
                                          // котороая будет записана в конец вектора строк.
 
    while(cin >> s_temp)                            // пока есть ввод
        str_vec.push_back(s_temp);      // добавлять в конец вектора строку s_temp
 
// ВОТ ТУТ самое сложное и непонятное мне
        const char **p_arr = new const char *[str_vec.size()];               //создаю указатель на первый элемент
// динамического массива, каждый элемент которого является указателем. Т.б. получается указатель на указатель. 
//Предполагется что этот указатель всегда будет указывать на 1й элемент массива.
 
        const char **p_to_arr=p_arr; // создаю указатель, которым буду перебирать массив указателей, и 
//присваиваю ему начальное значение начала массива. (Опять же, получается это указатель на указатель)
 
        
        for (vector<string>::iterator str_it=str_vec.begin();str_it!=str_vec.end();++str_it, ++p_to_arr) // здесь 
// итератором читаю каждый элемент вектора, и записываю его в переменную s_temp, которая теперь выполняет 
//функцию хранения текущей строки для последущей записи указателя на отвечающую ей С-stryle строку в массив 
//указателей p_arr
        {
                s_temp=*str_it;
                *p_to_arr=s_temp.c_str(); // в 1м прогоне цикла  p_to_arr = p_arr, потом оно каждый раз 
// инкрементируется циклом for. 
 
//Как пишут .c_str(); - дает указатель на С-строку, который я записываю в ячейку массива указателей, в ту ячейку
// на которую указывает  p_to_arr.  Мне кажется, что ошибка где-то здесь в операторе присвоения.
                
        }
        
// Далее идет просто вывод на экран содержимого вектора, и содержимого массива указателей для сравнения
        for (vector<string>::iterator str_it=str_vec.begin();str_it!=str_vec.end();++str_it)
        {
            cout << *str_it << endl; // с вектором тут все нормально
        }
        _getch();
                
 
        for (p_to_arr=p_arr;p_to_arr!=p_arr+str_vec.size();++p_to_arr)
        {
            
            cout << *p_to_arr << endl;   // а вот тут проблема: все элементы на которые указывают указатели 
// из массива указателей, являются последним элементом вектора, т.б. последней введенной строкой
        }
    _getch();
    return 0;
}
При вводе 3х строк:
qqq
www
eee

Ожидаемый результат:
qqq
www
eee
qqq
www
eee

Получаемый результат:
qqq
www
eee
eee
eee
eee

Более того при отсутствии циклов для проверки я сделал так. Перед выводом на экран содержимого массива указателей:
C++
1
2
s_temp="qqq";               //вообще я присвоил не напрямую, а как 1й элемент вектора, который был в тот момент равен "qqq"
p_arr[0]=s_temp.c_str();
И даже после этого все не так как надо. Все указатели из массива указателей стали указывать на "qqq".

Подскажите пожалуйста, где я ошибся.

Добавлено через 1 час 18 минут
Ошибку нашел. Объясните, пожалуйста, почему именно так.
Если заменить итератор на индекс все работает. Но хотелось бы разобраться с итераторами.
Т.б. если вместо
C++
1
2
3
4
5
 for (vector<string>::iterator str_it=str_vec.begin();str_it!=str_vec.end();++str_it, ++p_to_arr)
        {
                s_temp=*str_it;
                *p_to_arr=s_temp.c_str();
        }
Написать
C++
1
2
3
4
        for (string::size_type ind=0;ind!=str_vec.size();++ind, ++p_to_arr)
        {
                *p_to_arr=str_vec[ind].c_str();
        }
,
то все работает. Где я совершил ошибку при переделывании блока for под работу с итераторами?
А так же вместо -
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru