С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

24.12.2013, 22:32. Просмотров 1064. Ответов 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 у меня чисто прикладное назначение будет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2013, 22:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как присвоить элементам массива указателей строки (C++):

Обращение к элементам линейного списка через элементы массива указателей - C++
Вот полная версия программы. Компилятор не выдаёт ошибок, но при выполнении, судя по всему, на строчке 278, при попытке обратится к...

Элементам массива присвоить значения, соответствующие их позициям в массиве - C++
Напишите программу, где определен массив из десяти целых чисел, каждому элементу которого присвоено значение, соответствующего его позиции...

Не получается присвоить значение элементу массива указателей типа char *a[3] - C++
В попытках разобраться с массивами, указателями, массивами указателей и т.п. написал вот такой код: int main() { char *a = {...

Надо присвоить значения массива а массиву b с помощю функции, и указателей - C++
Надо присвоить значения массива а массиву b с помощю функции, и указателей... Я написал, но не работет... В чём дело? #include...

Как работает массив указателей на строки двумерного массива? - C++
Есть работающий код: void main() { int matrix; for(i = 0; i &lt; 3; i++) { for(int j = 0; j &lt; 5; j++) { matrix...

Матрицы, Ассемблерная вставка. Всем элементам второй строки присвоить соответствующие элементы последнего столбца - C++
помогите решить пожалуйста, у меня зачет срочно!! в первом модуле определена квадратная матрица N го порядка. выводится измененная...

8
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
24.12.2013, 22:41 #2
Цитата Сообщение от andrejap Посмотреть сообщение
char* sArM = new char [iM];
Выделяешь строку. Нужно так:
C++
1
char** sArM = new char* [iM]; //массив строк
Добавлено через 2 минуты
Но константы тебе б стоило вынести в глобальную область видимости, или сделать static.
Или при присваивании строк (в том цикле) не указатель присваивать, а использовать strcpy
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
24.12.2013, 22:49  [ТС] #3
Ааа, т.к. строковой литерал это по-сути указатель на массив char, то бишь указатель на массив указателей, то и в куче мне нужно было также выделять массив указателей, первый элемент которого, соб-сно, являет собой char** ?
0
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");
}
1
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 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).
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
25.12.2013, 00:01  [ТС] #6
Цитата Сообщение от monolit Посмотреть сообщение
Поэтому лучше копировать значения - сначала для каждого s[i] выделить нужное количество памяти (уже new cha[...]), и воспользоваться функцией strcpy
Имеешь ввиду, что лучше наверняка вбить резерв, скажем, на 21 ячейку и применять strcpy?
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
25.12.2013, 00:50 #7
Нет, я имею ввиду не забывать про символ конца строки '\0', про то, что ему тоже нужна память)
C++
1
2
s[i] = new char[strlen(sArCalendar[i])+1];
strcpy(s[i], sArCalendar[i]);
1
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 использовать.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
25.12.2013, 11:08 #9
Ну, с error'ом вполне ожидаемо, я что-то такое про константность писал. А последнее - это предупреждение... Скорее всего вне этой функции эти строки просто не существуют, и просто присвоение указателей не очень хорошая идея (прямо скажем-плохая). Или вынеси определение и объявление sArCalendar в глобальную ообласть видимости, или используй new+strcpy
0
25.12.2013, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2013, 11:08
Привет! Вот еще темы с ответами:

Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк - C++
Напишите программу, присваивающую значения элементов списка указателей на символьные строки в стиле С (тип char* ) элементам вектора строк...

Сортировка массива указателей на строки - C++
Приветствую. Есть задание: &quot;Напишите программу, которая вводит строки с клавиатуры с помощью cin&gt;&gt;...в объявленный Вами двухмерный...

Обращение ко второму элементу массива указателей на строки - C++
Добрый день. Не получается обратиться ко второму элементу: #include &lt;stdio.h&gt; int main(void) { char **ss = { &quot;Run away&quot;, ...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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