Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2015, 11:57   #1
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию Как заполнить строку, пока не кончится память

Здравствуйте!
Изучаю си. Определил объединение, элементами которого являются структура и строка. Структура в памяти занимает 28 байт, следовательно и на строку отводится такое же кол-во памяти. Как мне заполнить (проинициализировать) строку символами на всю длину в 28 байт?

Алгоритм не прошу Прошу направить мысли
Ka2R вне форума Ответить с цитированием
Старый 12.03.2015, 12:15   #2
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Код:
union m_u
{
    char str[28];
    int i;
};

int main()
{
  m_u mu;
  memcpy(&mu, "123456789012345678901234567", sizeof(mu));
  printf("%s", mu.str);
  return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 12.03.2015, 12:24   #3
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Код:
union m_u
{
    char str[28];
    int i;
};

int main()
{
  m_u mu;
  memcpy(&mu, "123456789012345678901234567", sizeof(mu));
  printf("%s", mu.str);
  return 0;
}
Объединение имеет вид

Код:
union str {
	struct 	tip {				/*Определяем структуру, где элементы - типы данных*/
		char 				ch;			
		unsigned char 		uch;		
		signed char 		sch;
		short int 			shi;
		short unsigned int 	usi;
		int 				i;
		unsigned int 		ui;
		long int 			li;
		long unsigned int 	uli;
		float 				fl;
                             } b;	
	char *string;
}
Ka2R вне форума Ответить с цитированием
Старый 12.03.2015, 12:52   #4
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

char* string - это не строка, а указатель и его размер 4 байта, и указывать он может на строку любой длины.
Не понятен смысл такого union'a.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 12.03.2015, 12:53   #5
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Код:
  union m_u
  {
    char str[28]; // типа структура
    
    char* str_p;
  };
  m_u mu;
  char* str = "123471287128471827312948129481924891284912849128491284919248";
  mu.str_p = str;
  printf("%s", mu.str_p);
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 12.03.2015, 13:07   #6
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
char* string - это не строка, а указатель и его размер 4 байта, и указывать он может на строку любой длины.
Не понятен смысл такого union'a.
У меня есть структура.

Код:
struct 	tip {				/*Определяем структуру, где элементы - типы данных*/
		char 				ch;			
		unsigned char 		uch;		
		signed char 		sch;
		short int 			shi;
		short unsigned int 	usi;
		int 				i;
		unsigned int 		ui;
		long int 			li;
		long unsigned int 	uli;
		float 				fl;
} b;
Размер этой структуры складывается из размеров элементов. В результате
Код:
sizeof(struct tip);
Будет равен 28

Задача стоит такая, чтобы взять строку и инициализировать ее на длину структуры символом 1, например.

Чтобы строка сразу имела размер структуры, мне поставлено условие поместить строку и структуру в объединение.

Я неправильно объявляю строку?
А если так

Код:
union str {
	struct 	tip {				/*Определяем структуру, где элементы - типы данных*/
		char 				ch;			
		unsigned char 		uch;		
		signed char 		sch;
		short int 			shi;
		short unsigned int 	usi;
		int 				i;
		unsigned int 		ui;
		long int 			li;
		long unsigned int 	uli;
		float 				fl;
} b;	
	char string[];
}
Как мне, не помещая размер структуры в отдельную переменную, заполнить циклом строку?
Ka2R вне форума Ответить с цитированием
Старый 12.03.2015, 13:15   #7
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Как-то так?

Код:
union m_u
{
    struct entry
    {
       char str[28]; 
    } b;
    
    char str[sizeof(entry)];
};

int main()
{
  m_u mu;  
  memset(&mu, 0, sizeof(mu));
  memset(&mu, 49, sizeof(mu) - 1);
  printf("%s", mu.str);
  return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 12.03.2015, 13:31   #8
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Как-то так?

Код:
union m_u
{
    struct entry
    {
       char str[28]; 
    } b;
    
    char str[sizeof(entry)];
};

int main()
{
  m_u mu;  
  memset(&mu, 0, sizeof(mu));
  memset(&mu, 49, sizeof(mu) - 1);
  printf("%s", mu.str);
  return 0;
}
Ваш код не компилится.

06.c:12: error: ‘entry’ undeclared here (not in a function)

гцц не понимает строку
char str[sizeof(entry)];

И зачем нам так явно указывать размер строки, если все элементы объединения имеют одинаковую длину - максимальную длину из элементов?
Ka2R вне форума Ответить с цитированием
Старый 12.03.2015, 13:36   #9
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Если объявить строку в объединении просто

Код:
char str[];
То компилятор будет ругаться
error: flexible array member in union

Поэтому я думал использовать указатель на строку
Ka2R вне форума Ответить с цитированием
Старый 12.03.2015, 13:48   #10
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Додумался как объявить строку!

Код:
#include <stdio.h>
#include <string.h>


union str {
  struct  tip {       /*Определяем структуру, где элементы - типы данных*/
    char        ch;     
    unsigned char     uch;    
    signed char     sch;
    short int       shi;
    short unsigned int  usi;
    int         i;
    unsigned int    ui;
    long int      li;
    long unsigned int   uli;
    float         fl;
} b;  
  char string[sizeof(struct tip)];
};

int main()
{
  union str st;  
  printf("%i %i\n", sizeof(st.string), sizeof(struct tip));
  return 0;
}
Ka2R вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выделить память под строку и записать в нее данные marenko.lilia Помощь студентам 3 22.08.2014 11:31
Как определить метод, добавивший строку в память bigvova Общие вопросы Delphi 4 24.11.2013 22:08
Заполнить следующую строку greensage Microsoft Office Excel 5 24.05.2013 12:21
Ввести строку в память динамически. _PROGRAMM_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 12.03.2012 12:59
не соображу пока как правиьно зациклить rdbykjhl Паскаль, Turbo Pascal, PascalABC.NET 4 10.02.2011 19:09