Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Заблокирован

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

12.09.2012, 16:36. Показов 3247. Ответов 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;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.09.2012, 16:36
Ответы с готовыми решениями:

Можно ли в массив чаров считать строку полностью?
У меня получается считать только первое слово, понимаю что есть функция getline() и еще я какую-то похожую видел, но желательно без этих...

Считать символы из файла в массив
Пожалуйста. нужен код для реализации считывания символов из файла (.txt) в массив На С (и если не трудно, то и на С++) Спасибо

Массив строк как массив указателей на массивы чаров
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;; Files = NULL; int searchFile()...

7
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 16:49
Не совсем ясно понял задание... Не это ли имелось в виду?
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;
 }
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 16:51
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;
}
0
Заблокирован
12.09.2012, 16:56  [ТС]
Цитата Сообщение от Andsteadur Посмотреть сообщение
Не совсем ясно понял задание... Не это ли имелось в виду?
Да, спасибо, только здесь много неизвестных мне функций, пока оставлю, главное решено... =) вопрос теперь в другом почему во втором примере чушь на экран вылазит, вроде все правильно присвоил...
0
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 17:05
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;
            }
0
Заблокирован
12.09.2012, 17:51  [ТС]
Ну е-мое, а я уж не знал что и думать...

Добавлено через 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;
    }
0
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 18:11
Пару замечаний:
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';
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.09.2012, 19:02
~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. Все же на плюсах пишем. Оставьте простор для оптимизаций компилятору.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.09.2012, 19:02
Помогаю со студенческими работами здесь

Очистить массив чаров
#include &quot;stdafx.h&quot; #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;windows.h&gt; #include &lt;sstream&gt; using...

Считать файл и символы из него записать в массив (без string!)
Нужно считать файл и символы из него записать в массив. Пример: Есть файл file.txt, в котором написано hello world; Нужно считать...

Порядок байт. Массив чаров приводится к типу unsigned int.
Есть массив из 4 char. Массив приводится к типу unsigned int и затем данные извлекаются в переменную типа unsigned int. Нужно, чтобы байты...

Массив: Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое вектора.
Помогите решить, не знаю с чего начать: 1. Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое ...

Считать символы
Добрый день. Второй день пытаюсь решить вопрос: у меня есть строковый массив string answers = new string; задача в том чтобы считать в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru