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

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

12.09.2012, 16:36. Показов 3290. Ответов 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru