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

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

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Как присвоить элементам массива указателей строки - C++

24.12.2013, 22:32. Просмотров 875. Ответов 8
Метки нет (Все метки)

Здравствуйте.

Есть ф-ия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char* initialize_m(const int& iM, const int& iSM) {
    const char* sArCalendar [12] = {
        sArCalendar [0] = "January",
        sArCalendar [1] = "Febuary",
        sArCalendar [2] = "March",
        sArCalendar [3] = "April",
        sArCalendar [4] = "May",
        sArCalendar [5] = "June",
        sArCalendar [6] = "July",
        sArCalendar [7] = "August",
        sArCalendar [8] = "September",
        sArCalendar [9] = "October",
        sArCalendar [10] = "November",
        sArCalendar [11] = "December"
    };
 
    char* sArM = new char [iM];
    for (int i = 0; i < iM; ++i)
    {
        // ...
    }
    return sArM;
В том цикле, где многоточие, у меня не получается организовать присваивание каждому sArM[i] значение sArCalendar[i]. Ну получается, правда, только первую букву. Что-то не до конца понял я эти строковые литералы, ибо со string* у меня все нормально получалось.

Помогите, плз...

//для iSM у меня чисто прикладное назначение будет...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 22:32     Как присвоить элементам массива указателей строки
Посмотрите здесь:

Надо присвоить значения массива а массиву b с помощю функции, и указателей C++
Матрицы, Ассемблерная вставка. Всем элементам второй строки присвоить соответствующие элементы последнего столбца C++
Обращение ко второму элементу массива указателей на строки C++
C++ Найти суммы положительных элементов строк и присвоить их элементам побочной диагонали
С использованием функций и указателей отсортировать строки массива строк по убыванию C++
Обращение к элементам линейного списка через элементы массива указателей C++
Как связать строки и массив указателей на них C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
182 / 182 / 21
Регистрация: 24.03.2011
Сообщений: 657
Завершенные тесты: 1
24.12.2013, 22:41     Как присвоить элементам массива указателей строки #2
Цитата Сообщение от andrejap Посмотреть сообщение
char* sArM = new char [iM];
Выделяешь строку. Нужно так:
C++
1
char** sArM = new char* [iM]; //массив строк
Добавлено через 2 минуты
Но константы тебе б стоило вынести в глобальную область видимости, или сделать static.
Или при присваивании строк (в том цикле) не указатель присваивать, а использовать strcpy
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.12.2013, 22:49  [ТС]     Как присвоить элементам массива указателей строки #3
Ааа, т.к. строковой литерал это по-сути указатель на массив char, то бишь указатель на массив указателей, то и в куче мне нужно было также выделять массив указателей, первый элемент которого, соб-сно, являет собой char** ?
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
24.12.2013, 22:53     Как присвоить элементам массива указателей строки #4
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
#include <iostream>
#include <windows.h>
using namespace std;
 
void main()
{
    int iM = 12;
    char* sArCalendar [12] = {
        sArCalendar [0] = "January",
        sArCalendar [1] = "Febuary",
        sArCalendar [2] = "March",
        sArCalendar [3] = "April",
        sArCalendar [4] = "May",
        sArCalendar [5] = "June",
        sArCalendar [6] = "July",
        sArCalendar [7] = "August",
        sArCalendar [8] = "September",
        sArCalendar [9] = "October",
        sArCalendar [10] = "November",
        sArCalendar [11] = "December"
    };
 
    char massiv[12][60];
    for (int i = 0; i < iM; i++)
    {
        strcpy(massiv[i], sArCalendar[i]);
    }
 
    for (int i = 0; i < iM; i++) {
      cout << massiv[i] << endl;
    }
 
 
system("pause");
}
monolit
182 / 182 / 21
Регистрация: 24.03.2011
Сообщений: 657
Завершенные тесты: 1
24.12.2013, 23:18     Как присвоить элементам массива указателей строки #5
Строка - это по-сути char*. Тебе нужен массив строк => char* *
Вот, так нагляднее(вроде)
C++
1
2
3
4
typedef char* TString; //строка
TString* s; // массив строк
// Это эквивалентно
char** s;
Сперва выделяешь память под массив (я показа как)
Если ты строки берешь откуда-то, то в принципе можно просто присвоить указатель
К примеру:
C++
1
s[1] = sArCalendar[1]
Если отбросить возможные проблемы с константностью, то так будет работать. Но когда будешь изменять значения в s, изменятся и в sArCalendar;
Поэтому лучше копировать значения - сначала для каждого s[i] выделить нужное количество памяти (уже new cha[...]), и воспользоваться функцией strcpy
C++
1
strcpy(s[i], sArCalendar[i]);
Памяти выделить нужно, естественно, достаточно (длина строки+1).
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
25.12.2013, 00:01  [ТС]     Как присвоить элементам массива указателей строки #6
Цитата Сообщение от monolit Посмотреть сообщение
Поэтому лучше копировать значения - сначала для каждого s[i] выделить нужное количество памяти (уже new cha[...]), и воспользоваться функцией strcpy
Имеешь ввиду, что лучше наверняка вбить резерв, скажем, на 21 ячейку и применять strcpy?
monolit
182 / 182 / 21
Регистрация: 24.03.2011
Сообщений: 657
Завершенные тесты: 1
25.12.2013, 00:50     Как присвоить элементам массива указателей строки #7
Нет, я имею ввиду не забывать про символ конца строки '\0', про то, что ему тоже нужна память)
C++
1
2
s[i] = new char[strlen(sArCalendar[i])+1];
strcpy(s[i], sArCalendar[i]);
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
25.12.2013, 00:54  [ТС]     Как присвоить элементам массива указателей строки #8
Короче исправил с рекомендациями, теперь мне пишет:
main.cpp:64:38: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
А если убираю const для массива указателей, то выдает предупреждение:
main.cpp:58:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

Не могли бы пояснить зачем нужно здесь const? И что за устаревшая конверсия?

Добавлено через 4 минуты
Цитата Сообщение от monolit Посмотреть сообщение
1
2
s[i] = new char[strlen(sArCalendar[i])+1];
strcpy(s[i], sArCalendar[i]);
Попробую позже и таким путем - для каждого элемента по очереди new использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2013, 11:08     Как присвоить элементам массива указателей строки
Еще ссылки по теме:

C++ Дан массив из 10 элементов, присвоить всем элементам значение
C++ Как работает массив указателей на строки двумерного массива?
Двумерный массив указателей присвоить другому указателю C++
C++ Найти суммы положительных элементов строк матрицы и присвоить их элементам побочной диагонали
Сортировка массива указателей на строки C++

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

Или воспользуйтесь поиском по форуму:
monolit
182 / 182 / 21
Регистрация: 24.03.2011
Сообщений: 657
Завершенные тесты: 1
25.12.2013, 11:08     Как присвоить элементам массива указателей строки #9
Ну, с error'ом вполне ожидаемо, я что-то такое про константность писал. А последнее - это предупреждение... Скорее всего вне этой функции эти строки просто не существуют, и просто присвоение указателей не очень хорошая идея (прямо скажем-плохая). Или вынеси определение и объявление sArCalendar в глобальную ообласть видимости, или используй new+strcpy
Yandex
Объявления
25.12.2013, 11:08     Как присвоить элементам массива указателей строки
Ответ Создать тему
Опции темы

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