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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 15:29     Запись вектора строк в массив указателей на тип char #1
Решаю задачу 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 под работу с итераторами?
А так же вместо -
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2013, 15:29     Запись вектора строк в массив указателей на тип char
Посмотрите здесь:

Запись строки char в массив char C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк C++
Вектор строк и массив указателей на тип char C++
C++ Как удалить массив указателей char*
Массив строк как массив указателей на массивы чаров C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 15:49     Запись вектора строк в массив указателей на тип char #2
C++
1
2
 s_temp=*str_it;
*p_to_arr=s_temp.c_str();
копирование из итератора в s_temp.
потом берется c_str и раздается всем. если размер s_temp не изменяется, то указатель, возвращаемый
c_str - тоже не меняется. ну и получается что всем раздается один и тот же указатель.
зачем копировать в s_temp? можно ведь сразу *p_to_arr = str_it->c_str();
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
15.12.2013, 15:57     Запись вектора строк в массив указателей на тип char #3
Wlk, указывать внутрь вектора это плохо. Когда говорят, что вектор это массив имеют ввиду много общих черт, но только не постоянство размещения в памяти. Достаточно создать массив указателей на char:
C++
1
char *ptrs_to_c_str[];
размером вектор (size())
и пробежавшись по вектору повыделять память и скопировать в нее поэлементно и поустанавливать переменные массива на полученные строки char *.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 16:22  [ТС]     Запись вектора строк в массив указателей на тип char #4
*p_to_arr = str_it->c_str(); - вот это решило проблему. Неувязка в том, что по ходу изучения книги этот оператор еще не встречался.
Цитата Сообщение от DU Посмотреть сообщение
потом берется c_str и раздается всем. если размер s_temp не изменяется, то указатель, возвращаемый
c_str - тоже не меняется. ну и получается что всем раздается один и тот же указатель.
Вот тут не совсем понятно. У меня появилось следующее объяснение:
s_temp.c_str() - всегда указывает на одну и ту же область памяти, даже при том что данные хранимые в этой области могут меняться.
В моем представлении s_temp.c_str() при каждом новом изменении данных хранимых в s_temp должно генерировать указатель на другую область в памяти. Видимо это не так. Или я не прав?

Цитата Сообщение от IGPIGP Посмотреть сообщение
указывать внутрь вектора это плохо.
Цитата Сообщение от IGPIGP Посмотреть сообщение
и пробежавшись по вектору повыделять память и скопировать в нее поэлементно и поустанавливать переменные массива на полученные строки char *
Тут тоже не совсем понял. Насколько я понимаю, использовать итераторы для векторов и указатели для массивов - корректно. Или что вы имеете ввиду, конкретнее?

Спасибо.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 16:39     Запись вектора строк в массив указателей на тип char #5
если размер буфера в строке не увеличивается (т.е. когда строка изменяется, но она умещается во внутренний буфер std::string), то перевыделять память нет особой нужды. она это и не делает. что в стандарте на этот счет написано - я не знаю. может там и нет гарантии, что это всегда так и закладываться на такую особенность не стоит. так же не стоит закладываться на то, что после изменения строки c_str вернет указатель на другой участок памяти.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
15.12.2013, 17:04     Запись вектора строк в массив указателей на тип char #6
Цитата Сообщение от Wlk Посмотреть сообщение
Насколько я понимаю, использовать итераторы для векторов и указатели для массивов - корректно. Или что вы имеете ввиду, конкретнее?
Конечно корректно. Берём итератор и смотрим длину строки в нём. Выделяем память (+1). Устанавливаем на неё указатель из массива (очередной). Тут для обращения можно и без индекса, - арифметически. Потом копируем по указателю содержимое итератора.
DU, как я понимаю, для небольших или наперёд заданных векторов, это так и есть. Но если вектор не умещается в непрерывной области (перестал помещаться), то память может быть полностью перевыделена. Впрочем, это может быть реализовано по-разному.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 17:21  [ТС]     Запись вектора строк в массив указателей на тип char #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Выделяем память (+1).
Вы имеете ввиду выделение памяти для символьного массива, в котором будет хранится строка+"\0", и потом установка указателя в массив?
Я это реализовал вот так:
C++
1
2
3
4
5
6
for (vector<string>::iterator str_it=str_vec.begin();str_it!=str_vec.end();++str_it,++p_to_arr)
          {        
        char *el = new char[str_it->size() + 1];
        strncpy(el, str_it->c_str(),str_it->size() + 1);
        *p_to_arr = el;
                  }
Только получается, что каждый раз создается новый массив с указателем el на первый элемент. И он фактически хранит только текущую строку в виде массива char.


И еще вопрос:
почему при использовании
C++
1
2
3
const char **p_to_arr=p_arr; // ok
........
*p_to_arr = str_it->c_str();   // ok
я могу производить запись в данные на которые указывает указатель. Он же указатель на константу? По моему представлению, он мог бы производить только считывание, но не запись.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 17:39     Запись вектора строк в массив указателей на тип char #8
если указатель на константу - то он может сперва указывать на одну константу. потом на другу. это менять можно. это у вас и происходит. но вот значение этой константы через этот указатель поменять нельзя.

немного по проще (рассмотрим просто указатели, а не указатели на указатели).
есть четыре разных варианта:
1) int* ptr; // неконстантный указатель на неконстантую область памяти. менять можно все.
2) const int* cptr; // указатель на константу. можно указывать на разные константы, но значения этих констант менять через этот указатель нельзя (они же константы).
3) int* const ptrc; // указывает на одну и ту же область памяти. на другую указать нельзя. но значение этой области менять можно. т.е. этот указатель указывает на неконстанту.
4) const int* const cptrc = 0; // указывает на одну и ту же область памяти. на другую указать нельзя. и значение этой области через этот указатель менять нельзя. т.к. он указывает на константу.

добавте сюда еще указатели на указатели со всеми возможными вариантами константности и получится еще больше комбинаций
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
15.12.2013, 17:48     Запись вектора строк в массив указателей на тип char #9
Цитата Сообщение от Wlk Посмотреть сообщение
Только получается, что каждый раз создается новый массив с указателем el на первый элемент.
Так Вы его и создаёте. Создайте массив указателей:
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
char *ptrs_to_c_str[];
размером вектор (size())
Потом каждый из указателей в массиве инициализируйте строкой итератора.
ps мне нравится Липман. Если не обращать внимание на багатство примеров, этого везде достаточно. Но задачи у него вполне приличные. Обратите внимание на 2) задания:
<<2) Скопируйте этот вектор в массив указателей на тип char. >>
Ехидство состоит в том, что говорится чаще всего так, а имеется в виду: по указателю.
И тут дело даже не в том, что указателю все равно на что он указывает. Кроме типа. Хотя и в этом тоже. Главное привыкнуть, что указатель хранит адрес, а значение лежит по этому адресу.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 17:49  [ТС]     Запись вектора строк в массив указателей на тип char #10
Цитата Сообщение от DU Посмотреть сообщение
немного по проще (рассмотрим просто указатели, а не указатели на указатели).
Так вот в том-то и вопрос. Мне казалось что, если указатель на указатель является константным (т.б. такой, что не может изменить то, на что он указывает, а указывает он именно на указатель(адрес константы)), то и менять то на что он указывает нельзя (т.б. нельзя менять значения указателя на константу (на который указывает указатель на указатель на константу)). А получается, что хоть указатель на указатель и является константным, его константность все равно распространяется только на доступ к значению константы, которая находится в конце этой длинной цепочки, а ко всем предыдущим звенам у него есть полный доступ на запись/считывание.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 18:02     Запись вектора строк в массив указателей на тип char #11
есть еще трудности с терминами.
встречаются следующие варианты:
константный указатель - тут не совсем понятно о чем это
указатель на константу - тут все ок. зная это, предыдущий термин можно однозначно понимать так:
константный указатель - этот то, который всегда указывает в одну и ту же область памяти. указать на другую
запрещают правила с++ (константы инициализируются и больше не меняются).

если указатель на указатель является константным (т.б. такой, что не может изменить то, на что он указывает, а указывает он именно на указатель(адрес константы))
то, что описано в скобках - это свойства указателя на константу, а не константного указателя (как написано перед скобками).
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 18:13  [ТС]     Запись вектора строк в массив указателей на тип char #12
Да, во всех случаях имел ввиду указатель на константу (т.е. указатель без привязки к области памяти но без доступа на запись объекта на который он указывает).
Т.б. если V -переменная, const int *Р=&V - указатель на переменную с доступом на считывание (указатель на константу),
То что такое const int **PP=&P - указатель на указатель на переменную с доступом на считывание (указатель на константу)? На что распространяется его ограничение доступа к записи? Только на конечную переменную V или и на адрес который в Р?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
15.12.2013, 18:44     Запись вектора строк в массив указателей на тип char #13
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
#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
const int sz = 7;
char *source_c_str[] = {"Mama","мыла","Раму","Кришну", "Вишну", "вишню","раму"};//для простой инициализации массива. Дальше забудем о нём
////////////
vector<string> vec(source_c_str, source_c_str+sz);
//объявляем искомый массив указателей также как и source_c_str, а инициализирум позже:
char *output_c_str[sz];
vector<string>::iterator beg_it = vec.begin();
vector<string>::iterator end_it = vec.end();
int len_tmp=0;
int shift_in_output_c_str=0;
 
for(vector<string>::iterator it = beg_it; it != end_it; ++it){
    len_tmp=it->size()+1;
*(output_c_str+shift_in_output_c_str) = new char[len_tmp];
 
strcpy(*(output_c_str+shift_in_output_c_str), it->c_str());
shift_in_output_c_str++;
}
 
for(int i=0; i<sz; ++i)cout<<*(output_c_str+i)<<" ";
cout<<endl;
cout<<"Вернее:"<<endl;
cout<<*output_c_str<<" "<<*(output_c_str+1)<<" "<<*(output_c_str+6)<<"!"<<endl;
system("pause");
return 0;
}
Садистский с точки зрения синтаксиса примерчик. Как раз для укрепления духа.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 18:48  [ТС]     Запись вектора строк в массив указателей на тип char #14
Очень даже хорошо. Но. Вы конечно, с формальной точки зрения обошли индексы, и пользовались только итераторами и указателями. Но фактически shift_in_output_c_str=0 - это индекс элемента массива.
Эквивалетно *output_c_str[shift_in_output_c_st].
Мне тоже намного легче с индексами работать. Но тогда мне никогда не понять указателей
У меня же использован указатель именно на текущий элемент массива, который рассматривается, и зная его не угадаешь, какой (какой по счету, с каким индексом) элемент массива под ним скрывается. Я даже не знаю хорошо это или плохо.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 18:52     Запись вектора строк в массив указателей на тип char #15
const int **PP=&P - это неконстантный указатель на неконстантный указатель на const int.

с тайпдефами чуть легче это все воспринимается. вот надеюсь ничего не напутал.
используем тайпдефы + перегрузку и позволяем компилятору решить, что есть что и выдать нам результат:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
 
typedef int* PtrToInt;
typedef const int* PtrToConstInt;
 
 
void Foo(PtrToInt*)
{
  std::cout << "PtrToInt*" << std::endl;
}
 
void Foo(PtrToConstInt*)
{
  std::cout << "PtrToConstInt*" << std::endl;
}
 
void Foo(const PtrToInt*)
{
  std::cout << "const PtrToInt*" << std::endl;
}
 
void Foo(const PtrToConstInt*)
{
  std::cout << "const PtrToConst*" << std::endl;
}
 
int main ()
{
  {
    int** p = 0;        // неконстантный указатель на неконстантный указатель на инт
    int** const pc = 0; // константный указатель на неконстантный указатель на инт
    Foo(p);
    Foo(pc);
 
    /*
    p = 0;      // ок.  p   - не константа
    *p = 0;     // ok.  p   - указывает на неконстанту
    *(*p) = 0;  // ok. (*p) - указывает на неконстанту
 
    //pc = 0;    // error. pс    - константа
    *pc = 0;     // ok.    pc    - указывает на неконстанту
    *(*pc) = 0;  // ok.    (*pc) - указывает на неконстанту
    */
  }
 
  {
    const int** p = 0;        // неконстантный указатель на неконстантный указатель на const int
    const int** const pc = 0; // константный указатель на неконстантный указатель на const int
    Foo(p);
    Foo(pc);
 
    /*
 
    p = 0;          // ок.     p   - не константа
    *p = 0;         // ok.     p   - указывает на неконстанту
    //*(*p) = 0;    // error. (*p) - указывает на константу
 
    //pc = 0;       // error.  pс   - константа
    *pc = 0;        // ok.     pc   - указывает на неконстанту
    //*(*cp) = 0;   // error. (*pc) - указывает наконстанту
 
    */
  }
 
  {
    int* const * p = 0;        // неконстантный указатель на константный указатель на инт
    int* const * const pc = 0; // константный указатель на константный указатель на инт
    Foo(p);
    Foo(pc);
 
    /*
    p = 0;      // ок.    p    - не константа
    //*p = 0;   // error. p    - указывает на константу
    *(*p) = 0;  // ok.    (*p) - указывает на неконстанту
 
    //pc = 0;    // error. pс    - константа
    //*pc = 0;   // ok.    pc    - указывает на константу
    *(*pc) = 0;  // error. (*pc) - указывает на неконстанту
    */
  }
 
  {
    const int* const * p = 0;        // неконстантный указатель на константный указатель на const int
    const int* const * const pc = 0; // константный указатель на константный указатель на const int
    Foo(p);
    Foo(pc);
 
    /*
    p = 0;        // ок.    p    - не константа
    //*p = 0;     // error. p    - указывает на константу
    //*(*p) = 0;  // error. (*p) - указывает на константу
 
    //pc = 0;    // error. pс    - константа
    //*pc = 0;   // error. pc    - указывает на константу
    //*(*pc) = 0;  // error. (*pc) - указывает на константу
    */
  }
 
  return 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
15.12.2013, 19:11     Запись вектора строк в массив указателей на тип char #16
Цитата Сообщение от Wlk Посмотреть сообщение
shift_in_output_c_str=0 - это индекс элемента массива.
Это не индекс. Это счётчик. Чем-то же нужно итерировать. Это вполне стандартный подход к такого рода задачам. А индекс это то что в квадратных скобках.
Создайте семь указателей типа char *one, char *two... и сами поймёте, что показывать такое никому не нужно.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 19:28  [ТС]     Запись вектора строк в массив указателей на тип char #17
C++
1
2
 78   //*pc = 0;   // ok.    pc    - указывает на константу
 79   *(*pc) = 0;  // error. (*pc) - указывает на неконстанту
Немного не понятно. Ошибка или правильно таки?

Я вроде понял (или мне так только кажется), но уже при очеееень медленном восприятия этого всего. А файлик сразу сохранил. Хорошая шпаргалка мне будет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 20:09     Запись вектора строк в массив указателей на тип char #18
строка раскоменчена. это компилится. т.е. там все ок. должно быть так:
*(*pc) = 0; // ок. (*pc) - указывает на неконстанту. значит менять можно.
наглючил при копипасте.
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
15.12.2013, 20:25  [ТС]     Запись вектора строк в массив указателей на тип char #19
Оно компилится да. Я имел ввиду так же что, если
Цитата Сообщение от DU Посмотреть сообщение
int* const * p = 0; // неконстантный указатель на константный указатель на инт
int* const * const pc = 0; // константный указатель на константный указатель на инт
C++
1
 //78 *pc = 0;   // ok.    pc    - указывает на константу
то в строке 78 тоже ошибка (в комментарии по крайней мере). Записать данные в константу нельзя же. Когдя буду пользоваться, как шпаргалкой, мне именно комментарии буду важны.
Ну насчет 79 строки вы пояснили.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 20:40     Запись вектора строк в массив указателей на тип char
Еще ссылки по теме:

C++ Ввод строк и запись их в массив указателей
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++
array char* to char* (значения массива указателей в один указатель) C++

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2013, 20:40     Запись вектора строк в массив указателей на тип char #20
да, верно подмечено. там тоже камент кривой. меняем на:
C++
1
2
  int* const * const pc = 0; // константный указатель на константный указатель на инт
  //*pc = 0;   // error.  pc    - указывает на константу. менять нельзя
Yandex
Объявления
15.12.2013, 20:40     Запись вектора строк в массив указателей на тип char
Ответ Создать тему
Опции темы

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