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

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

Войти
Регистрация
Восстановить пароль
 
AnreyKazakov
Заблокирован
#1

Считать символы из вектора в массив чаров - C++

12.09.2012, 16:36. Просмотров 744. Ответов 7
Метки нет (Все метки)

Задача из вектора string перекидать значения в массив чаров, каждый элемент вектора это должен быть один из массивов...
Я не могу сделать чтоб массивов была пачка в зависимости от размера вектора, с одним массивом получилось, но он создается\удаляется при каждой итерации, а в задаче надо чтоб их пачка была, разных массивов.
Вот код с одним массивом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include <cstring>
int main(){
    using std::cout;using std::cin; using std::endl;using std::vector;using std::string;using std::getline;
    string str1;
    vector<string> vec1;
    while(getline(cin,str1)){vec1.push_back(str1);}
    string word;
    for(vector<string>::iterator i=vec1.begin();i!=vec1.end();++i){
        word=*i;
        int k=word.end()-word.begin();
        const char* q=new char[k];
        q=word.c_str();
        cout<<q;
        delete[] q; 
        cout<<endl;
        }
    return 0;
    }
Да и что странно, когда я пытался посимвольно перекинуть из стринг в чар на экран чушь выходила, вот код тоже:
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
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
int main(){
    using std::cout;using std::cin; using std::endl;using std::vector;using std::string;using std::getline;
    string str1;
    vector<string> vec1;
    while(getline(cin,str1)){vec1.push_back(str1);}
    string word;
    for(vector<string>::iterator i=vec1.begin();i!=vec1.end();++i){
        word=*i;
        int k=word.end()-word.begin();
        char* q=new char[k];
        q[0]='\0';
        for(string::iterator j=word.begin();j!=word.end();++j){
            *q=*j;
            ++q;
            cout<<*j;/*выводит нормальное значение*/
            cout<<*q;/*выводит мусор какой-то...*/
            }
        delete[] q; 
        cout<<endl;
        }
    return 0;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 16:36     Считать символы из вектора в массив чаров
Посмотрите здесь:
Можно ли в массив чаров считать строку полностью? C++
C++ Считать символы из файла в массив
Массив строк как массив указателей на массивы чаров C++
Очистить массив чаров C++
Порядок байт. Массив чаров приводится к типу unsigned int. C++
C++ Считать русские и английские символы с консоли
Считать символы из потока ввода вместе с пробелами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 16:49     Считать символы из вектора в массив чаров #2
Не совсем ясно понял задание... Не это ли имелось в виду?
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
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include <cstring>
int main()
{
    using std::cout;using std::cin; using std::endl;using std::vector;using std::string;using std::getline;
    string str1;
    vector<string> vec1;
    while(getline(cin,str1)){vec1.push_back(str1);}
    size_t sz = vec1.size();
    char **p = new char*[sz];
    for(size_t i = 0; i < sz; ++i)
    {
        string &wrd = vec1.at(i);
        p[i] = new char[wrd.size() + 1];
        std::copy(wrd.begin(), wrd.end(), p[i]);
        p[i][wrd.size()] = '\0';
        cout<<p[i]<<endl;
   }
   
   for( size_t i = 0; i < sz; ++i)
   {
      delete [] p[i];
   }
   delete [] p;
    return 0;
 }
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 16:51     Считать символы из вектора в массив чаров #3
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
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
 
// Вот так старайтесь поменьше делать. Это дурной тон:
// выделять память в одном месте и удалять в другом.
// Но если аккуратно, то можно.
char* new_flattened(const std::vector<std::string> &vec)
{
  size_t length = 1;
  for (size_t i = 0; i < vec.size(); ++i) {
    length += vec[i].size();
  }
  char *data = new char[length];
  { char *pos = data;
    for (size_t i = 0; i < vec.size(); ++i) {
      memcpy(pos, vec[i].c_str(), vec[i].size());
      pos += vec[i].size();
    }
  }
  data[length - 1] = '\0';
  return data;
}
 
int main()
{
  std::vector<std::string> puppy;
  puppy.push_back("A");
  puppy.push_back("BC");
  puppy.push_back("DEF");
  puppy.push_back(" ");
  puppy.push_back("OMG");
  
  char *array = new_flattened(puppy);
  std::cout << array;
  delete [] array;
}
AnreyKazakov
Заблокирован
12.09.2012, 16:56  [ТС]     Считать символы из вектора в массив чаров #4
Цитата Сообщение от Andsteadur Посмотреть сообщение
Не совсем ясно понял задание... Не это ли имелось в виду?
Да, спасибо, только здесь много неизвестных мне функций, пока оставлю, главное решено... =) вопрос теперь в другом почему во втором примере чушь на экран вылазит, вроде все правильно присвоил...
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 17:05     Считать символы из вектора в массив чаров #5
C++
1
2
3
4
5
6
        for(string::iterator j=word.begin();j!=word.end();++j){
            *q=*j;
            ++q;
            cout<<*j;/*выводит нормальное значение*/
            cout<<*q;/*выводит мусор какой-то...*/
            }
Потому что после того как произошло присваивание(строка 2), производится смещение указателя(строка 3), и он начинает указывать на область памяти, которая не была инициализирована. Поэтому и выводится всякая ерунда.

C++
1
2
3
4
5
6
        for(string::iterator j=word.begin();j!=word.end();++j){
            *q=*j;
            cout<<*j;/*выводит нормальное значение*/
            cout<<*q;/*выводит нормальное значение*/
            ++q;
            }
AnreyKazakov
Заблокирован
12.09.2012, 17:51  [ТС]     Считать символы из вектора в массив чаров #6
Ну е-мое, а я уж не знал что и думать...

Добавлено через 33 минуты
Во, все, доделал, как и хотел второй вариант =) Не знал просто что можно объявлять массив указателей, случайно наткнулся в разделе многомерных массивов.... вот код )
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
#include <iostream>
#include <vector>
#include <iterator>
#include <string>
int main(){
    using std::cout;using std::cin; using std::endl;using std::vector;using std::string;using std::getline;
    string str1;
    vector<string> vec1;
    while(getline(cin,str1)){vec1.push_back(str1);}
    string word;
    int vend=vec1.end()-vec1.begin();
    char* q[vend];
    int endv=0;
    for(vector<string>::iterator i=vec1.begin();i!=vec1.end();++i){
        word=*i;
        int k=word.end()-word.begin();
        q[endv]=new char[k];
        q[endv][0]='\0';
        for(string::iterator j=word.begin();j!=word.end();++j){
            *q[endv]=*j;
            cout<<*q[endv];
            ++q[endv];
            }   
        cout<<endl;
        ++endv;
        }
        for(int pos=0;pos!=vend;++pos){delete[] q[pos];}
    return 0;
    }
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 18:11     Считать символы из вектора в массив чаров #7
Пару замечаний:
1.
C++
1
char* q[vend];
где-то прокатит, где-то нет. По стандарту не должно работать, нужно константное значение или значение, которое может быть вычислено во время компиляции.
C++
1
2
3
char** q = new char*[vend];
...
delete [] q;
2.
C++
1
2
int vend=vec1.end()-vec1.begin();
int k=word.end()-word.begin();
лучше использовать
C++
1
2
int vend = vec1.size();
int k = word.size();
3.
C++
1
q[endv][0]='\0';
Вообще бесполезная строчка, потому как в следующем цикле этот элемент будет изменен. Если нужно чтобы в конце строки char был нуль символ, то нужно
C++
1
2
q[endv]=new char[k + 1]; //дополнительный элемент под нуль-символ
q[endv][k]='\0';
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 19:02     Считать символы из вектора в массив чаров
Еще ссылки по теме:
Умножение массива чаров C++
Как считать из файла символы и цифры одновременно? Структуры C++
C++ В чем ошибка? Считать из файла и преобразовать символы в их коды.
C++ Считывание чаров из cin происходит не корректно
Заменить строки массивом массивов чаров C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.09.2012, 19:02     Считать символы из вектора в массив чаров #8
~OhMyGodSoLong~,
C++
1
memcpy(pos, vec[i].c_str(), vec[i].size());
Логичнее бы использовать vec[i].data() если пишем в реалиях С++03. Да и вообще резоннее http://cplusplus.com/reference/string/string/copy/ юзать. Ну или std::copy. Все же на плюсах пишем. Оставьте простор для оптимизаций компилятору.
Yandex
Объявления
12.09.2012, 19:02     Считать символы из вектора в массив чаров
Ответ Создать тему
Опции темы

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