Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 09:46   #1
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию Простой вопрос STL

Пришлось мне написать одну программу на этом языке звёздочек и амперсандов.. Возникла проблема, вынес её в отдельный код - повторилась, ура.

Задача - положить N строк из строки ch (она изменяется в процессе) в вектор, а потом положить их по одной в ch и что-то с ними делать.

В моём коде получается, что я кладу в массив не строки, а указатели на них, следовательно, при изменении ch меняется весь вектор. И при вводе
--> qwer
qwerty
qw
вывод будет таким
<-- qw
qw
qw

Как изменить код? И сделайте на сколько можно проще, пожалуйста.

Вот код:
Код:
   #include <iostream>
   #include <vector>
   #include <cstring>

   int main()
   {
      std::vector <char*> vec;
      char ch [1024];

      std::cin >> ch;
      vec.push_back(ch);
      std::cin >> ch;
      vec.push_back(ch);
      std::cin >> ch;
      vec.push_back(ch);

      std::vector <char*>::iterator i;
      for (i=vec.begin(); i<vec.end(); i++)
      {
           unsigned int j=0;
           for (j=0; ((j<strlen(*i))&&(j<1024)); j++)
                ch[j] = (*i)[j];
           ch[j] = '\0';
           std::cout << ch  << std::endl;
      }
      return 0;
   }
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)

Последний раз редактировалось AnKor94; 03.04.2013 в 10:08. Причина: изменил код чтоб было понятнее для чего он. всё равно ничего не работает.
AnKor94 вне форума Ответить с цитированием
Старый 03.04.2013, 10:33   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Как изменить код?
Не класть указатели, очевидно. В данном случае спасёт простая замена char* на std::string, который и разрулит все проблемы с копированием.
Abstraction вне форума Ответить с цитированием
Старый 03.04.2013, 10:45   #3
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Не класть указатели, очевидно. В данном случае спасёт простая замена char* на std::string, который и разрулит все проблемы с копированием.
Ну да, так я уже попробовал, но.. Чтобы сохранить массив символов нужно преобразовать его в стринг, а чтобы достать - обратно? Какой-то троллейбус из булки хлеба.
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Старый 03.04.2013, 10:53   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Чтобы сохранить массив символов нужно преобразовать его в стринг, а чтобы достать - обратно?
Зачем - обратно? Чем Вас std::string не устраивает?
Нет, можете делать всё то, что делает за Вас std::string, самостоятельно - выделять новую память, копировать в неё строку и класть указатель на неё в вектор; потом при уничтожении вектора не забыть её освободить. Просто std::string - это класс, специально предназначенный, чтобы заниматься всем этим за Вас.
Abstraction вне форума Ответить с цитированием
Старый 03.04.2013, 10:58   #5
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Зачем - обратно? Чем Вас std::string не устраивает?
В программе использую библиотеку muParser, которая принимает на вход си-строку. Данные беру с клавиатуры pocketbook'a, библиотека libInkView, которая возвращает тоже си-строку. Так что использовать std::string бессмысленно.
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Старый 03.04.2013, 11:06   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Так что использовать std::string бессмысленно.
Неверный вывод. std::string - это просто обёртка над char*, реализующая прозрачное для программиста копирование, ну, и некоторые другие полезные вещи. Поэтому преобразовывать получаемый char* в std::string и передавать дальше по вызовам результат вызова std::string::c_str() - лучший метод, который я могу предложить, в плане экономии нервов и минимизации ошибок.

Разумеется, вольному - воля:
Код:
   #include <iostream>
   #include <vector>
   #include <cstring>

   int main()
   {
      std::vector <char*> vec;
      char ch [1024];
      char* temp;

      std::cin >> ch;
      temp = new char[1024];
      strncpy(temp, ch, 1023);
      vec.push_back(temp);
      std::cin >> ch;
      temp = new char[1024];
      strncpy(temp, ch, 1023);
      vec.push_back(temp);
      std::cin >> ch;
      temp = new char[1024];
      strncpy(temp, ch, 1023);
      vec.push_back(temp);

      std::vector <char*>::iterator i;
      for (i=vec.begin(); i<vec.end(); i++)
      {
           unsigned int j=0;
           for (j=0; ((j<strlen(*i))&&(j<1024)); j++)
                ch[j] = (*i)[j];
           ch[j] = '\0';
           std::cout << ch  << std::endl;
      }
      for (i=vec.begin(); i<vec.end(); i++)
      {
            delete[] *i;
      }
      return 0;
   }
Abstraction вне форума Ответить с цитированием
Старый 03.04.2013, 12:44   #7
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию

Спасибо, всё понял. Ух, от с++ аж руки трясутся.

offtop: вспомнился Керниган, : «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво».
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простой вопрос Ins1De C++ Builder 5 10.02.2012 22:32
Класс vector и сложносоставные массивы. вопрос к спецам в STL haruhi Общие вопросы C/C++ 1 19.11.2011 16:32
Вопрос о функциональном объекте less в stl Познающий Помощь студентам 0 01.06.2009 11:14
простой вопрос Анастасия123456789 Помощь студентам 2 10.03.2009 09:23