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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
#1

Массив символов в структуре - C++

24.03.2010, 01:42. Просмотров 1673. Ответов 16
Метки нет (Все метки)

Подскажите, пожалуйста, как объявить структуру, в которой первый элемент - массив массивов символов (например:
werrtyfg
sdf
sgfdh),
второй и третий элементы - целочисленные массивы? Все массивы динамические. И как выделить для них память?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2010, 01:42     Массив символов в структуре
Посмотрите здесь:

Указатели + структура, а в структуре 2-мерный массив - C++
11111

Заполнить массив в структуре элементами другого массива - C++
Не могу понять как сделать так, чтобы элементам массива в структуре присвоить значения простого массива. пробую и strcpy() и просто...

Как выделить память под массив в структуре? - C++
Здравствуйте , воnрос конечно глуnый , но голову я сижу ломаю долго , есть Структура , в ней есть массив , как nод этот массив выделить...

Обращение к динамической структуре через массив указателей - C++
При попытке обратиться к элементу динамической структуры через связанный с ним элемент массива указателей выдаёт ошибку (со строчки 73): ...

Массив в структуре. invalid use of non-static data member - C++
Добрый день. Есть структура, понадобилось добавить в неё массив с дин. размером. struct MyStruct { // ... uint16_t...

Как в структуре задать массив строк фиксированного размера? - C++
Как в структуре задать массив строк фиксированного размера? я попытался так struct pupil { string a; } Оказалось я задал длину...

Выделение памяти под динамический двумерный массив в структуре - C++
Доброво времени суток, дорогие товарищи-кодеры! Работав проектом, столкнулся с тем что удобно было бы запилить двумерный динамик в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.03.2010, 06:54     Массив символов в структуре #2
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
#include <stdlib.h>
 
struct arrays {
    char **charr;
    int nlines, lsize;
 
    int *iarr1;
    int iasize1;
 
    int *iarr2;
    int iasize2;
};
 
...
 
    struct arrays s;
 
    s.nlines = 3;
    s.lsize = 100;
    s.iasize1 = 10;
    s.iasize1 = 20;
 
    s.charr = (char **) malloc(s.nlines*sizeof(char *));
    /* выделил память - проверь её на NULL */
 
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
    s.charr[1] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
    s.charr[2] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    s.iarr1 = (int *) malloc(s.iasize1*sizeof(int));
    /* выделил память - проверь её на NULL */
    s.iarr2 = (int *) malloc(s.iasize2*sizeof(int));
    /* выделил память - проверь её на NULL */
размер можно и снаружи хранить
но тогда нельзя сделать разные структуры с разными размерами (путанее получится)
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
24.03.2010, 08:12  [ТС]     Массив символов в структуре #3
Спасибо большое!
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
26.03.2010, 16:39  [ТС]     Массив символов в структуре #4
А можно ли чтоб количество строк было динамическое, а строка статический массив символов? Если да, то как объявить и выделить память?

Добавлено через 2 часа 41 минуту
И ещё одна проблемка: если я записываю допустим в s.charr[2] какую-нить строку, то эта же строка записывается и в s.charr[0], и в s.charr[1], а мне так не надо))
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
26.03.2010, 19:06     Массив символов в структуре #5
Значит, при всём моём уважении к accept, ответа на вопрос получено не было.
Во-первых, что за массив указателей?
Ячно было сказано, три массива: массив символов и два целочисленных. О массиве указателей на символы речь не шла.

НО это ладно, допустим, кашу маслом не испортигь. Но! Самое главное, я не увидел, чтобы
размеры массивом МОЖНО БЫЛО ВВОДИТЬ ВО ВРЕМЯ ИСПОЛНЕНИЯ ПРОГИ!

А ведь именно такая возможность и делает динамические массивы таковыми. Короче, вот как надо
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
39
40
41
42
43
44
45
46
#include <windows.h>
#include <stdio.h>
 
 
int main() {
                SetConsoleCP(1251);
                SetConsoleOutputCP(1251); 
 
 //ИТак, структурка
 struct to_chto_nado {
  char* ukaz_na_sim;
  char* ukaz_na_int_1;
  char* ukaz_na_int_2;
 } vot_ono;
 
 
 //ЭТо вот и есть те самые динамически переменные
 int kol_vo_sim;   
 int kol_vo_int_1;   
 int kol_vo_int_2;
 
 printf ("Вводи количество символов потом количество чисел и ещё одно через пробелы\n");
 scanf ("%d%d%d", &kol_vo_sim, &kol_vo_int_1, &kol_vo_int_2);   
 
 //Можешь расскоментировать и проверить
 //printf ("\nkol_vo_sim= %d   kol_vo_int_1= %d  kol_vo_int_2=  %d", kol_vo_sim, kol_vo_int_1, kol_vo_int_2);   
 
 //Теперь собсно массивы
 vot_ono.ukaz_na_sim= new char [kol_vo_sim];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_1];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_2];
 
//Тут пеоарботали, 
//....................
 
//а теперь память освобождаем
 delete [] vot_ono.ukaz_na_sim;
 delete [] vot_ono.ukaz_na_int_1;
 delete [] vot_ono.ukaz_na_int_2;
 
//Всё!
    getchar ();
    getchar ();
    /*конец*/ 
 return 0;
}
Кстати, тас по-моему сам не знгает чего хочет. В его последнем сообщении идёт речь о количестве строк.
Каких строк, позвольте спросить? Заявлена ОДНА строка- массив символов. Всё!
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
26.03.2010, 20:27  [ТС]     Массив символов в структуре #6
Мне нужен не просто массив символов, а массив массивов символов, где первый индекс - номер строки, а второй - символа в этой строке. Например:
sdfg
asd
as
fgdfg

Количество строк должно быть динамическое, а количество символов или динамическое, или статическое.

Просто в текстовике у меня будет инфа типа:
fg 56 566
sfgd 555 7
wer 546 567

И мне нужно кинуть эту инфу в структуру. Я всё смогу сделать, кроме как выделить норм память...

А размеры кстати вводить не надо, у меня размер - количество строк в текстовике
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.03.2010, 06:21     Массив символов в структуре #7
На C++ это достаточно просто:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
struct txt2struct
{
    std::vector<std::string>    sarray;
    std::vector<int>            iarray1;
    std::vector<int>            iarray2;
    friend std::istream& operator>>(std::istream& is, txt2struct& s);
    friend std::ostream& operator<<(std::ostream& os, const txt2struct& s);
    void clear();
};
 
std::istream& operator>>(std::istream& is, txt2struct& s)
{
    if(is==NULL)
        throw(std::exception("An attempt to access the input stream has failed"));
    while(!is.eof())
    {
        std::string ts;
        int ti1, ti2;
        is >> ts >> ti1 >> ti2;
        //Если читаем из консольного потока, и нажали ctrl+z
        if(is.eof())
            break;
        if(is.bad())
            throw(std::exception("Error reading the input stream"));
        s.sarray.push_back(ts);
        s.iarray1.push_back(ti1);
        s.iarray2.push_back(ti2);
    }
    return is;
}
 
std::ostream& operator<<(std::ostream& os, const txt2struct& s)
{
    if(os==NULL)
        throw(std::exception("An attempt to access the output stream has failed"));
    for(size_t i=0; i<s.sarray.size(); ++i)
    {
        os << s.sarray[i] << " " << s.iarray1[i] << " " << s.iarray2[i] << std::endl;
        if(os.bad())
            throw(std::exception("Error writing to the output stream"));
    }
    return os;
}
 
void txt2struct::clear()
{
    sarray.clear();
    iarray1.clear();
    iarray2.clear();
}
 
int main()
{
    try
    {
        txt2struct s;
        std::ifstream ifs("input.txt");
        //Ввод структуры из файла
        ifs >> s;
        //Добавление в структуру из консоли
        std::cin >> s;
        //Вывод содержимого в консоль
        std::cout << s;
        //Можно очищать структуру
        s.clear();
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        system("pause");
        return 1;
    }
    system("pause");
    return 0;
}
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
27.03.2010, 09:31  [ТС]     Массив символов в структуре #8
Так то оно может и просто, но С++ я ток начал изучать, и поэтому нужно что-то типа того, что написал accept или kravam... А за std мня в универе заставят переделывать
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
27.03.2010, 17:17     Массив символов в структуре #9
Цитата Сообщение от stratovarius Посмотреть сообщение
Мне нужен не просто массив символов, а массив массивов символов, где первый индекс - номер строки, а второй - символа в этой строке. Например:
sdfg
asd
as
fgdfg
Слушай, автор, ты тень на плетень не наводи. Определяйся давай с условием и не путай людей и сам не путайся
Если у тебя будет массив массивов символов, то первый элемент никак не может быть номером строки. Первый элемент (как и любой другой)- массив символов! Согласно заявленному!

То же самое и со вторым элементом.

(Ну или адрес нулевого элемента, чтобы к словам не прикапывались.)

Добавлено через 29 минут
Дальше. В строке будет статическиое количество символов или динамическое?
ТОже непонятно.
Короче, вот тебе то, что ты просил вчера.
МАссив строк динамический, сама строка статична.

Итак, пояснения.
С динамическим массивом умеютработать все, синтаксис простой

C++
1
2
char* p= new char [5]
 delete [] p;
В нашем случае мы формируем динамический массив строк. Следовательно, переменная p должна иметь тип : строка такая-то. А ещё точнее: строки из стольки-то символов.
Такого типа в языке C нет, поэтому вводим его сами (не синоним имени типа а новывй тип!)

НОвый типа объявляеться с помощью struct
Итак, поехали

C++
1
2
3
4
5
6
struct p {
 char a1;
 char a2;
 ...
 char aN;
}
Теперь а- новый тип, а объявление

C++
1
p stroka
дастпеременную такоготипа, то есть массив из NHJ символов. НО, понятное дело, что это не наш метод, поэтому поправим объявление ноговго типа:

C++
1
2
3
struct p {
 char a1 [N];
}
Теперь чтобы выделить память, дропустим, для 5-ти строк, надо вот так вот записать: (цифра 5 вводится с клавиатуры- вот она, динамика.)
C++
1
p* stroka= new p [5]
Теперь переменная styroka будет указыватьна нулевой символ массива 5 строк из N символов
Что я и делаю в коде, с учётом того, что массив строк есть член структуры.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <windows.h>
#include <stdio.h>
#define kolvo_sim_v_stroke
 
int main() {
                SetConsoleCP(1251);
                SetConsoleOutputCP(1251); 
 
 //НОвый тип "массив символов из kolvo_sim_v_stroke элементов"
 //Это статический массив
 struct mas_sim_iz_skolki_to_tam_elementov {
  char mas [kolvo_sim_v_stroke];
 };  
 
 //ИТак, структурка
 struct to_chto_nado {
 
  
  //А это динамический массив. То есть указатель на переменную 
  //типа "массив символов из kolvo_sim_v_stroke элементов", котоорый я ввёл выше
  mas_sim_iz_skolki_to_tam_elementov* ukaz_na_massiv_strok;
  
  
  char* ukaz_na_int_1;
  char* ukaz_na_int_2;
 } vot_ono;
 
 
 //ЭТо вот и есть те самые динамически переменные
 int kol_vo_strok;   
 int kol_vo_int_1;   
 int kol_vo_int_2;
 
 printf ("Вводи количество символов потом количество чисел и ещё одно через пробелы\n");
 scanf ("%d%d%d", &kol_vo_strok, &kol_vo_int_1, &kol_vo_int_2);   
 
 //Можешь расскоментировать и проверить
 //printf ("\nkol_vo_sim= %d   kol_vo_int_1= %d  kol_vo_int_2=  %d", kol_vo_sim, kol_vo_int_1, kol_vo_int_2);   
 
 //Теперь собсно массивы
 vot_ono.ukaz_na_massiv_strok= new mas_sim_iz_skolki_to_tam_elementov [kol_vo_strok];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_1];
 vot_ono.ukaz_na_int_1= new char [kol_vo_int_2];
 
//Тут пеоарботали, 
//....................
 
//а теперь память освобождаем
 delete [] vot_ono.ukaz_na_massiv_strok;
 delete [] vot_ono.ukaz_na_int_1;
 delete [] vot_ono.ukaz_na_int_2;
 
//Всё!
    getchar ();
    getchar ();
    /*конец*/ 
 return 0;
}
Добавлено через 4 минуты
Фиг поправишь, если есть код. Вот это вот:
"Теперь а- новый тип, а объявление"

НАдо понмать как
"Теперь p- имя нового типа новый тип, а объявление"

ВМесто NHJ читать N

Добавлено через 1 минуту
ВСё компильнулось, компилятор не ругался, хотя чёрт его знает, может где подводные камни есть, Автор тестируй, неудачные результаты сюда.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
27.03.2010, 21:41  [ТС]     Массив символов в структуре #10
Спасибо огромное! Обязательно протестирую, но не сегодня, а где-то через пару деньков... Просто непредвиденные семейые обстоятельства не дают этого сделать...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.03.2010, 04:04     Массив символов в структуре #11
Цитата Сообщение от stratovarius
А можно ли чтоб количество строк было динамическое, а строка статический массив символов? Если да, то как объявить и выделить память?
а там оно не динамическое ?
ты выделил массив, указал сколько там строк, потом удалил массив и выделил новый, новое количество строк записал туда
таким образом в структуре хранится указатель на динамический массив и текущее количество строк в нём
массив ещё может хранится вообще без количества строк (это выделяется массив указателей на строки и ещё один указатель в конце, куда записывается нулевой указатель, маркер конца массива)
можно сделать переменную, которая хранит количество строк, динамической (для неё будет выделяться память), тогда она будет в виде указателя, а он по размеру часто равен размеру самой переменной

Цитата Сообщение от stratovarius
И ещё одна проблемка: если я записываю допустим в s.charr[2] какую-нить строку, то эта же строка записывается и в s.charr[0], и в s.charr[1], а мне так не надо))
а как ты записываешь ?
надо через strcpy()

C
1
2
3
4
5
6
7
8
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    ...
 
    strcpy(s.charr[0], "abcd");
 
    strcpy(s.charr[1], "efgh");
вообще через strncpy(), так как у строки есть ограничение, но тогда не забывать ставить нуль-символ

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    s.charr[0] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    s.charr[1] = (char *) malloc(s.lsize);
    /* выделил память - проверь её на NULL */
 
    ...
 
    n = strlen("abcd") % s.lsize;
 
    strncpy(s.charr[0], "abcd", n);
 
    s.charr[0][n] = '\0';
 
    n = strlen("efgh") % s.lsize;
 
    strncpy(s.charr[1], "efgh", n);
 
    s.charr[0][n] = '\0';
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
29.03.2010, 16:10  [ТС]     Массив символов в структуре #12
kravam, всё отлично, память выделяется норм, вот только нельзя работать со стандартными функциями для строк (например, strcpy), если переменная объявлена типа mas_sim_iz_skolki_to_tam_elementov, ошибка: c Cannot convert mas_sim_iz_skolki_to_tam_elementov to char*...

Либо посмотри мой код:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
 
struct string
{
  char str[15];
};
 
struct structure
{
    string *group;
    int *mass;
    int *days;
};
 
structure s;
 
char *CutString(char *line)
{
  char *temp;
  strtok(line," ");
  strcpy(temp,line);
  memmove(line,line+strlen(line)+1,strlen(line));
  return temp;
} 
 
void main()
{
  int i,count=0;
  FILE *file;
  char *line;
 
  clrscr();
 
  file=fopen("in.txt","r");
  while (!feof(file))
  {
    fgets(line,15,file);
    count++;
  }
  fclose(file);
 
  s.group = new string[count];
  s.mass = new int[count];
  s.days = new int[count];
 
  file=fopen("in.txt","r");
  for (i=0; !feof(file); i++)
  {
    fgets(line,15,file);
    s.group[i]=CutString(line);
    s.mass[i]=atoi(CutString(line));
    s.days[i]=atoi(line);
  }
  fclose(file);
 
  delete[]s.group;
  delete[]s.mass;
  delete[]s.days;
 
  getch();
}
В 55 строке ошибка: Cannot convert char* to string
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
29.03.2010, 18:39     Массив символов в структуре #13
Так а надо ли оно тебе?
Смотри, во первых, CutString возвращает указатель на char, а s.group[i] имеет тип string. Так что ничё не выйдет.

Если ты хочешь все соки выжать из s.group[i], тогда смотри, вот если мы напишем вот так:
s.group[i].str[0] или вот так s.group[i].str[1] так или вот так s.group[i].str[2], то всё будет работать ОК, эти записи корректны (вплоть до s.group[i].str[14], хе, впрочем s.group[i].str[15] тоже сработает, но ну его на фиг)

Теперь смотри, ты возвращаешь адрес на строку. Куда ты реально можешь его запихать? Особых вариантов я не вижу, вышеперечисленные переменные- элементы массива str, имеют тип char (а возвращается, напомню, указател на char).

Так что извини, каким боком массив символов относится к указателю на char, мне непонятно.

А если ты подразумеваешь, что переменная s.group[i].str суть адрес нулевого элемента массива и в эту переменную неплохо было бы вернуть значение, возвращаемое CutString, то вынужден тебя огорчить. Понимаешь, в чём дело, вот это сработает:

C++
1
char* per= s.group[i].str
ТО есть тут всё понятно, переменной per мы присвоили адрес нулевого элемента массива str

Но по этому адресу ты прописать ничего не сможешь потому, что такой переменной (s.group[i].str) просто нет! Памяти для неё не выделено! Вот это просто не сканает:

C++
1
s.group[i].str=  CutString
Ну, я думаю суть ты уловил. Когда s.group[i].str в правой части оператора присваивания, то прога нормально высчитывает адрес нулевого элемента, а когда в левой- извини, нет такой переменной s.group[i].str.

Чё делаем?
Я что-то не могу уловить, почему тебе просто вместо массива не объявить указатель на строку, вот так:
struct string
{
char* str;
};

И с ним не работать? В суть программы не вникал, но вот это сканало бы тогда:
s.group[i].str= CutString(line);

Добавлено через 13 минут
Хм, последний вариант очень даже ничего.
Но если тебе кровь из носа надо, чтобы возвращённая строка размещалась именно в этих 15-ти элементах... Тогда просто скопируй её и всё:
C++
1
2
3
4
5
6
7
8
struct string
{
  char str[15];
};
 
//Код всякий
 
strcpy (s.group[i].str, CutString(line));
...Как говорится, всего, и делов, то.
stratovarius
13 / 13 / 0
Регистрация: 12.07.2009
Сообщений: 114
29.03.2010, 19:14  [ТС]     Массив символов в структуре #14
Yahooooo!!!!! Спасибо тебе огромное!!! Всё работает!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2010, 19:16     Массив символов в структуре
Еще ссылки по теме:

В структуре хранятся следующие данные об учениках: фамилия, имя, отчество, рост, масса. Создать массив стру - C++
В структуре хранятся следующие данные об учениках: фамилия, имя, отчество, рост, масса. Создать массив структур и вычислить средний рост...

Дан массив а из 10 символов, массив b из 10 символов, и с = a+b - C++
Дан массив а из 10 символов, массив b из 10 символов, и с = a+b. Нужно отсортировать любой сортировкой, например: Сортировка слиянием или...

Дан массив слов .Добавить в конец каждого слова по k символов ,совпадающим с первым символов слова - C++
Дан массив слов .Добавить в конец каждого слова по k символов ,совпадающим с первым символом слова . Удалить из всех слов цифры ....

Задан массив из k символов. Преобразовать массив следующим образом: расположить символы в обратном порядке - C++
Задан массив из k символов. Преобразовать массив следующим образом: расположить символы в обратном порядке. Только начали изучать С++,...

массив символов - C++
необходимо ввести массив символов. как это сделать, потому что моя функция не работает почему-то. void massin(char a,int n) {...


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
29.03.2010, 19:16     Массив символов в структуре #15
Хе, чё-то я наговорил... И надо- то было последний вариант предложить. Ну, ничего, главное, чтобы был в коня корм.
Yandex
Объявления
29.03.2010, 19:16     Массив символов в структуре
Ответ Создать тему
Опции темы

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