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

Как посимвольно записать строку в массив?

27.06.2018, 14:42. Показов 41941. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня имеется строка типа string: str="молоко".
Нужно создать массив букв (наверное динамический, потому что строка всегда будет разная) и поместить туда строку посимвольно, т.е.: array[0]="М“, array[1]="O" и т.д.
Сам не смог придумать как это сделать, пробовал и в char переводить, но все равно ерунда какая-то получается.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2018, 14:42
Ответы с готовыми решениями:

Как посимвольно проверить строку, взятую из файла, на наличие определенных символов?
Нужно взять строку из текстового файла и посчитать знаки препинания в каждом предложении, не могу никак понять, каким образом можно строку,...

Как ввести посимвольно массив элементов?
Помогите, не знаю где ошибка: #include <iostream> #include <string> using namespace std; int main() { int n,i=0; ...

Как из переменной копировать цифры посимвольно в массив
Например: есть переменная int х=1112; мне нужно эту переменную разбить по цифрах. и каждую цифру скопировать в в масив. a=1; a=1; ...

18
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
27.06.2018, 14:55
proger10, можно так:
C++
1
char str[]="молоко";
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
27.06.2018, 15:04
Цитата Сообщение от proger10 Посмотреть сообщение
array[0]="М“
Двойные ковычки это не символьный тип данных, а стpоковый.
Тебе нужно так
C++
1
2
3
4
5
6
7
8
9
char *ptr = new char[30];
for (int i = 0; i < 30; i++ ) 
{
 
ptr[i] = 'а';
 
}
std::cout << ptr;
delete[] ptr;
Добавлено через 2 минуты
30 элементов заполнит буквой 'а'.
Это пpимеp, основываясь на нём делай свои pешения задач
0
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
27.06.2018, 15:07
Если вам надо именно создать копию содержимого string в виде массива символов:
C++
1
2
char *cstr = new char[str.size()];
strcpy(cstr, str.c_str());
Если хочется прям вручную посимвольно скопировать:
C++
1
2
3
4
char *cstr = new char[str.size()];
for (size_t i = 0; i < str.size(); i++)
    cstr[i] = str[i];
сstr[str.size()] = 0;
На случай, если у вас всё-таки константа, а не строка, то ответы выше.

Добавлено через 2 минуты
axela002, мне кажется вы забыли про ноль в конце строки...
0
1 / 1 / 0
Регистрация: 22.02.2016
Сообщений: 142
27.06.2018, 16:36  [ТС]
Спасибо всем!
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
27.06.2018, 19:01
proger10, ничего Вам делать не нужно. string это массив. str="молоко". str[0]='м', str[1]='о' и т.д.
0
Заблокирован
27.06.2018, 20:36
Цитата Сообщение от proger10 Посмотреть сообщение
Нужно создать массив букв
Зачем вам создавать массив букв? С типом std::string вроде как удобнее работать и они динамические вроде как? А если есть функции, которые работают с c-строками, то можно получатель указатель через функцию c_str, вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void print_stroki(const char* stroka) {
    for (int i = 0; stroka[i]; i++) {
        std::cout << stroka[i];
    }
    std::cout << "\n";
}
 
int main() {
    std::string stroka = "MOLOKO";
 
    print_stroki(stroka.c_str());
    
    return 0;
}
Добавлено через 3 минуты
Маленькое замечание, через c_str, наверно, не получится перезаписывать символы.

Добавлено через 1 минуту
Хотя при желании, на свой страх и риск, можно и так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
void change_stroki(char* stroka) {
    for (int i = 0; stroka[i]; i++) {
        stroka[i] = 'A' + i;
    }
}
 
void print_stroki(const char* stroka) {
    for (int i = 0; stroka[i]; i++) {
        std::cout << stroka[i];
    }
    std::cout << "\n";
}
 
int main() {
    std::string stroka = "MOLOKO";
 
    change_stroki((char*)stroka.c_str());
    print_stroki(stroka.c_str());
    
    return 0;
}
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
27.06.2018, 20:44
Зачем нужен массив - для разных задач и вполне возможно, что работа со строкой не будет устраивать по условиям задачи.

Проблема в том, что в строке "Молоко" содержаться не английские буквы, которые можно описать типом char. Здесь могут быть разные кодировки, от KOI8 и тд, но скорее всего применяется кодировка UNICODE или UTF-8, а там символ не впихнешь в тип char. Длина символа в UNICODE 2 байта и определяется типом wchar. работать с UINT-8 легче и проще, но длина символа колеблется от char до int32. Поэтому для хранения символов в массиве надо определится с кодировкой приходящих строк. Легче конечно определить массив как Vector<int32> и работать с ним. В таком массиве можно работать в любой кодировке.
0
 Аватар для bedvit
1209 / 260 / 22
Регистрация: 20.05.2016
Сообщений: 1,139
Записей в блоге: 22
28.06.2018, 10:19
AndreiUshakov, используйте std :: wstring, и все ваши проблемы должны уйти.
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
28.06.2018, 13:22
Цитата Сообщение от bedvit Посмотреть сообщение
используйте std :: wstring, и все ваши проблемы должны уйти.
Строка wstring хранит символы в UNICODE в типе wchar, поэтому для других кодировок проблема останется
0
 Аватар для bedvit
1209 / 260 / 22
Регистрация: 20.05.2016
Сообщений: 1,139
Записей в блоге: 22
28.06.2018, 13:46
AndreiUshakov, для utf-16 проблем нет. Для utf-8 с переменным количеством байт на символ, чуть сложнее. Но чем ваш Vector<int32> проще?

Добавлено через 2 минуты
В обоих случаях нужно конвертировать. В моем случае в 2 байта, в вашем в 4 байта. Не вижу в чем вектор выигрывает.
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
28.06.2018, 13:51
потому что можно хранить любую кодировку
0
 Аватар для bedvit
1209 / 260 / 22
Регистрация: 20.05.2016
Сообщений: 1,139
Записей в блоге: 22
28.06.2018, 14:03
В чем хранить? в Vector<int32>? Int32 вам не о чем не говорит?
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
28.06.2018, 14:57
Цитата Сообщение от bedvit Посмотреть сообщение
В чем хранить? в Vector<int32>? Int32 вам не о чем не говорит?
Не понял, о чем вы? В задаче хранить данные в массиве. std::vector<Int32> как динамический, с легкой возможностью обращения к любому элементу как через итератор, так и через индексы лучше всего подходит. Его также легко модифицировать, если ,например, потребутся подсчет количество символов в тексте. тогда легко обобщается при введении структуры
C
1
2
3
4
5
struct symbols {
  Int32 symbol;
  int     count;
};
std::vector<symbols>;
и вперед.
0
 Аватар для bedvit
1209 / 260 / 22
Регистрация: 20.05.2016
Сообщений: 1,139
Записей в блоге: 22
28.06.2018, 15:34
Цитата Сообщение от AndreiUshakov Посмотреть сообщение
В задаче хранить данные в массиве. std::vector<Int32> как динамический, с легкой возможностью обращения к любому элементу как через итератор,
то же самое есть и в std :: wstring. В чем вектор лучше, кроме того, что занимает больше места?
Второе, вы пишите
Цитата Сообщение от AndreiUshakov Посмотреть сообщение
потому что можно хранить любую кодировку
.
Как в векторе хранить, например UTF-8, с разным размером байт на символ?
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
28.06.2018, 16:05
Цитата Сообщение от bedvit Посмотреть сообщение
Как в векторе хранить, например UTF-8, с разным размером байт на символ?
анализ символа и соответственно вы храните либо байт, либо 2, либо 3, либо 4. Либо второй вариант - использование семейства std::codecvt
0
 Аватар для bedvit
1209 / 260 / 22
Регистрация: 20.05.2016
Сообщений: 1,139
Записей в блоге: 22
28.06.2018, 16:29
Цитата Сообщение от AndreiUshakov Посмотреть сообщение
анализ символа и соответственно вы храните либо байт, либо 2...
это же можно хранить и в std :: wstring.
О чем я писал выше
Цитата Сообщение от bedvit Посмотреть сообщение
В обоих случаях нужно конвертировать. В моем случае в 2 байта, в вашем в 4 байта. Не вижу в чем вектор выигрывает
Возможно несколько сложнее с редкими 3x и 4х байтовыми символами (кодируются парой WCHAR - так называемые «суррогаты»).
Вообщем, все зависит от задачи.
Если говорим про Win, где строки кодируются в UTF-16LE, здесь удобно работать с std :: wstring.
0
26 / 23 / 12
Регистрация: 25.06.2018
Сообщений: 91
28.06.2018, 19:16
Цитата Сообщение от bedvit Посмотреть сообщение
Вообщем, все зависит от задачи.
согласен. опять же все это написано для полного понимания проблемы,а уж выбор - на совести разработчика
0
1 / 1 / 0
Регистрация: 22.02.2016
Сообщений: 142
03.07.2018, 10:03  [ТС]
Всем спасибо большое. Решил задачу, как предложил Yetty, кодировка koi8-r.
Чтобы все правильно отражалось переписал символы в другой пустой массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2018, 10:03
Помогаю со студенческими работами здесь

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Считать посимвольно строку из консоли
Добрый день! Необходимо в программе организовать считывание длинной строки из консоли. Строка настолько длинная, что записывать её в память...

Посимвольно считать из переменной строку
Добрый вечер Нам задали написать программу &quot;Азбука МОРЗЕ&quot; Какой функцией считать посимвольно строку, например &quot;.--.&quot; Мне...

Считывает ли функция fgets строку посимвольно?
Проконсультируйте пожалуйста. Смотрите данная функция имеет три аргумента: //Первый из трех аргументов функции является указателем на...

Считать текст из файла и записать его посимвольно в квадратную матрицу
Мне дали задание, там нужно сделать программу которая считывает текст из файла и по букве делает массив. Я знаю странно звучит но...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru