Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
1nquisitor
3 / 3 / 1
Регистрация: 24.02.2014
Сообщений: 91
1

Массив char в структуре

01.03.2014, 15:24. Просмотров 1497. Ответов 3
Метки нет (Все метки)

Привет, разбираюсь вот со структурами. Уперся в заполнение массивы char, вложенные в структуру.
А именно не знаю как правильно сей массив заполнить. В первом случае как массив указателей мне удалось заполнить его следующим образом:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#define N 10
 
 
struct str
{
    char *a[N];
};
 
int main()
{
    struct str new1;
    *new1.a="aloha";
 
    printf("%s!\n", *new1.a);
    return 0;
}
Назревает вопрос- как заполнить массив указателей, используя скажем gets(new1.a) или fgets(new1.a,N, stdin). И вообще, как видит компилятор процесс заполнения массива указателей?


Вопрос 2) если у меня обычный массив, такое заполнение уже не катит. Выбивает ошибку.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#define N 10
 
 
struct str
{
    char a[N];
};
 
int main()
{
    struct str new1;
    new1.a="aloha";
 
    printf("%s!\n", new1.a);
    return 0;
}
Возможно я не различаю разницы между обычной символьной строкой и символьной строкой, вложенной в структуру? И аналогичный вопрос, как видит компилятор заполнение указанной строки?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 15:24
Ответы с готовыми решениями:

Не получается создать в структуре поле с именем (char[]) чтобы компилировалось без warning
Всем привет. Потребовала жизнь немного разобраться с С, (до этого были 1С и совсем немножко С#),...

Безразмерный массив в структуре
Добрый вечер, уважаемые форумчане. Столкнулся с проблемой при написании безразмерного массива в...

Как объявить массив в структуре
Привет. В чистом С я не силён, завалился на, казалось бы, простой задаче. Как правильно...

Создать динамический массив в структуре
Помогите создать динамический массив в структуре. Я туплю и не могу догнать, как это сделать

Как обнулить массив в структуре?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #define N 150 struct occurrence...

3
alkagolik
Заблокирован
01.03.2014, 17:31 2
Лучший ответ Сообщение было отмечено 1nquisitor как решение

Решение

Цитата Сообщение от 1nquisitor Посмотреть сообщение
А именно не знаю как правильно сей массив заполнить. В первом случае как массив указателей мне удалось заполнить его следующим образом
в этом случае ничего не заполняется. Элементу a[0] присваивется указатель на константный сроковый литерал (null terminate string). В первом варианте реализована возможно сть хранения N строк произвольной длины. При чем выделение и освобождение памяти под строки остается за кадром.
Цитата Сообщение от 1nquisitor Посмотреть сообщение
Назревает вопрос- как заполнить массив указателей, используя скажем gets(new1.a) или fgets(new1.a,N, stdin)
Порядок работы следующий:
1. выделить память под строку s
2. поместить туда необходимые для обработки данные (считать/скопировать)
3. присвоить указатель new.a[i] = s; если i < N вернуться к пункту 1
4. обработать данные
5. освободить память for (i = 0...) free(new.a[i])
Цитата Сообщение от 1nquisitor Посмотреть сообщение
если у меня обычный массив, такое заполнение уже не катит. Выбивает ошибку.
верно. Здесь попытка переписать адрес &a[0], что конечно же пресекается на этапе компиляции.
Цитата Сообщение от 1nquisitor Посмотреть сообщение
Возможно я не различаю разницы между обычной символьной строкой и символьной строкой, вложенной в структуру?
Похоже ты вообще мало что понимаешь в этих строках. Для начала попробуй уяснить что в этом языке нет абстракций (грубо говоря) и пользователю предоставлены только базовые типы данных - байты.
Цитата Сообщение от 1nquisitor Посмотреть сообщение
И аналогичный вопрос, как видит компилятор заполнение указанной строки?
массив - псевдолинейная последовательность блоков. Почему не байт? Потому что есть разные базовые блоки байт (1, 2, 4, 8, 12) и в разных архитектурах есть различия их адресации. Так вот, при считывании/копировании передаем адрес нулевого блока и последовательно заполняем блоки "памяти" данными до сигнала СТОП.
1
Evg
Эксперт CАвтор FAQ
20074 / 7641 / 585
Регистрация: 30.03.2009
Сообщений: 21,398
Записей в блоге: 30
02.03.2014, 11:19 3
1)

C
new1.a[0] = "aloha";
new1.a[1] = "trampampam";
new1.a[2] = "ololo";
...
2)

C
strcpy (new1.a, "aloha");
Добавлено через 36 секунд
В 1-м случае имеем массив указателей на char, а во втором - массив char'ов
1
1nquisitor
3 / 3 / 1
Регистрация: 24.02.2014
Сообщений: 91
02.03.2014, 15:48  [ТС] 4
Господа, спасибо. Ваши комментарии мне действительно помогли и расставили в голове все по полочкам.
0
02.03.2014, 15:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 15:48

Сделать динамический массив структур, причем в структуре так же существует динамический массив
Добрый день. Есть такая пзадача: нужно сделать динамический массив структур, причем в структуре...

Необходимо, чтобы в структуре символьный массив был динамическим
Здраствуйте! Помогите пожалуйста с преобразованием данной структуры. Необходимо, чтобы в структуре...

Массив целых чисел в массив char
Вот примерный код: char *c; int i; int *arr; for (i=0; i&lt;1000; i++) { arr =...


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

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

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