Форум: Форум C++Разное
Новые темы: 00
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Опят с этим массивом char..
 
 автор: Belkin   (17.08.2012 в 23:26)   письмо автору
 
 

Смотрите, есть такой массив:

char *arr[] = {"вася""петья""игорь"}; // порядок, но это я его сам инициализировал.


А как такой массив собрать автоматом? То есть вот пример:

Такая ситуация. Я итератором пробегаю по массиву и значения у меня имеет тип string, а мне нужно, чтобы после того как я пробежал, то в arr были все собранные значениями.

Вот пример грубой реализации:

char* arr[];
for(/* ляля тут значения, условия */)
{
    arr[] = student["name"];
}


И в итоге я получаю переменную, которая содержит имена всех собранных студентов, как в примере с инициализацией (в самом верху). Слышал про метод c_str(), но применить не пойму как.

Просто вот затупил совсем что-то..

  Ответить  
 
 автор: cheops   (18.08.2012 в 07:49)   письмо автору
 
   для: Belkin   (17.08.2012 в 23:26)
 

В случае char * автоматом ничего не получится... вам придется выделить память под каждый новый элемент, а потом не забыть её удалить. Причем выделить память лучше заранее.. char * arr[] - это фактически charr arr[][] - т.е. у вас массив строк, а каждая из строк сама является массивом символов char. Т.е. это даже не матрица, это массив переменной длины, элементы которого сами являются массивами переменной длины. Т.е. захотели положить в такую переменную строки, сначала сосчитали сколько их будет, потом выделили память под char **, затем вычислили сколько в первом элементе student["name"] символов выделили память под char * arr[0], перешли ко второй строке - тоже самое выделили память под char *arr[1]. Поработали со строками и в идем обратном порядке - возвращаем память сначала каждой строки, а в конце память под массив char**.

Программировать под C++ очень весело, дорого, времязатратно и код подвержен частым ошибкам. Зато вы контролируете каждый байт. Поэтому существуют более сложные реализации строк, с которыми бы и следовало бы работать... вот этот student["name"] откуда взялся и какой тип он имеет? Ведь в C++ довольно много типов строк, реализованных в виде классов (вы и сами можете ввести свой собственный тип строк), существует стандартный класс CString - вот он как раз и имеет метод c_str(), который в любой момент позволяет получить char *. Однако, вам возможно, работать на уровне char * вообще не нужно... Ведь CString или его аналоги позволяют манипулировать со строками более широкими и гибкими средствами, а главное сами заботятся об памяти (до определенного предела, конечно).

  Ответить  
 
 автор: Belkin   (18.08.2012 в 15:03)   письмо автору
4.6 Кб
 
   для: cheops   (18.08.2012 в 07:49)
 

Библиотека использовалась из STL - <string>.

Задача была создать телефонную книгу с возможностью вывод, добавления, удаления и поиска абонентов.

Дело в том, что есть метод, который создает меню. Он принимает параметр char* arr[], int count, то есть элементы меню и их количество.

И вот дошло дело до удаления, я хотел, чтобы выводился список студентов (как меню), то есть можно было выбрать кого-то и нажать для удаления, но для этого нужно было, чтобы этот список сформулировался, то есть превратился в такой вот массив.

Может как Вы сказали - не стоит использовать char* для пунктов меню, а какой-то другой вариант.

Мне главное, чтобы показали, как можно заполнить массив примерно таким видом.

Я сейчас прикрепил файл, с классом абоненты.

В main пропишите вот что

#include "phonebook.h"

int main()
{
setlocale(LC_ALL, "Russian");

Phonebook p;

return 0;
}


Сильно не удивляйтесь за то, если увидите бред. Основные моменты прокомментировал.
Метод remove().

Программа полностью работает, кроме пунктов Удаление и Поиск.

  Ответить  
 
 автор: cheops   (20.08.2012 в 14:17)   письмо автору
 
   для: Belkin   (18.08.2012 в 15:03)
 

Хм... а почему бы действительно не использовать тип string - создайте вектор строк или карту, как у вас и передавайте в функцию указатель или ссылку на неё.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования