The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Си - вставить число в строку символов (спасите мозг!)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от pollymer email on 19-Янв-10, 03:47 
Здравствуйте,

Надо сделать массив байт в котором  сначала идут служебные байты, потом строка - например как бы так:
1) const char *x=3,2,8,"string 1";


Но так не получается, возможно только
2) const char *x="\003\002\010string 1";

Но это не годится, так как числовые значения не известны (будут меняться при компиляции) и определены они через макро (еще и числа десятичные), например
#define VAR1 3
#define VAR2 2
#define VAR3 8


То есть запись 1) выглядела бы как:
3) const char *x=VAR1,VAR2,VAR3,"string 1"
Но мы знаем что это не работает, нужна запись типа 2), но туда не подставить макро...

Теоретически возможно
4) const char *x=VAR1,VAR2,VAR3,'s','t','r','i','n','g',0;
Но строки ожидаются большими и очень нужна наглядность... Кроме того такие массивы будут в программе в большом количестве. (gcc, FreeBSD 7)

В общем, задача на первый взгляд простецкая, а вот как ее решить?
Заранее благодарен за любой совет.

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от Slavaz (ok) on 19-Янв-10, 04:09 

>Здравствуйте,
>Надо сделать массив байт в котором  сначала идут служебные байты, потом
>строка - например как бы так:
>1) const char *x=3,2,8,"string 1";
>В общем, задача на первый взгляд простецкая, а вот как ее решить?

Оно?

#include <stdlib.h>
#include <stdio.h>


#define MY_FORMAT_STRING "%c%c%c%s"
char *make_my_crazy_format(int byte1, int byte2, int byte3, const char *str)
{
  char *buffer;
  int buff_len;
  buff_len = sprintf(NULL,MY_FORMAT_STRING, (char) byte1, (char) byte2, (char) byte3, str);
  if (buff_len < 0 )
    return NULL;

  buffer = malloc(buff_len+1);
  if (buffer == NULL)
    return NULL;

  (void) sprintf(buffer,MY_FORMAT_STRING, (char) byte1, (char) byte2, (char) byte3, str);

  return buffer;
}
#undef MY_FORMAT_STRING

...
char *tra_ta_ta = make_my_crazy_format(3,2,8,"string 1");
if (tra_ta_ta != NULL)
{
  // работа с переменной
  free(tra_ta_ta);
}

P.S. Не проверял, навскидку писал, как идею.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от pollymer email on 19-Янв-10, 04:44 
>>1) const char *x=3,2,8,"string 1";
>Оно?
>
>#define MY_FORMAT_STRING "%c%c%c%s"
>char *make_my_crazy_format(int byte1, int byte2, int byte3, const char *str)

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

Т.е. никакого программирования. Нужно "просто" научиться инициализировать строку.

вместо const char *p="\010aaa", *s="\002\010sss";
надо чтото типа #define XX 8 ,, const char *p=doSTRING(XX,"aaa"), s=doSTRING(2,XX,"sss");

где doSTRING - это ни в коем случае не функция (!) а макро

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от Av (??) on 19-Янв-10, 09:33 
>Нет, нужно просто задать статически набор строк - их можно будет применять
>многократно, без инициализации и ничего не освобождать. При этом количество служебных
>байт в начале строки может меняться.

в Си силами препроцессора никак.
выноси в отдельный файл, генерируемый перлом и подобными.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от pollymer email on 19-Янв-10, 12:39 
>в Си силами препроцессора никак.
>выноси в отдельный файл, генерируемый перлом и подобными.

к тому дело и идет... а была надежда..

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от jd (??) on 19-Янв-10, 14:36 
>в Си силами препроцессора никак.

Никогда не говори никогда ;)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. " конкатенировать строки?"  +/
Сообщение от Вова on 19-Янв-10, 11:34 
#define QUOTEME_(x) #x
#define VAR0 QUOTEME_(\3)
#define VAR1 QUOTEME_(\2)
#define VAR2 QUOTEME_(\010)

char *s = VAR0 VAR1 VAR2 "string 1";

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. " конкатенировать строки?"  +/
Сообщение от pollymer email on 19-Янв-10, 12:42 
>#define QUOTEME_(x) #x
>#define VAR0 QUOTEME_(\3)
>#define VAR1 QUOTEME_(\2)
>#define VAR2 QUOTEME_(\010)
>
>char *s = VAR0 VAR1 VAR2 "string 1";

VAR0 и др уже определены. А то возможно и через другие макро. Я не волен их переопределять. Именно неизвестность их конкретных значений (а они зависят иногда еще и от параметров компиляции) и создало проблему.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от jd (??) on 19-Янв-10, 15:19 
Более сюрреалистической и бессмысленной задачи представить сложно. Практика показывает, что если задача сформулирована путанно и выглядит странно, скорее всего её нужно описать более обще. Типа, не "Нам нужно две таблицы в базе: одна с полями INT, STRING, а другая с ещё чем-то там. Как их правильно связать?", а "Нужна база для магазина вешалок. Для товаров нужно хранить название, цену. Нужно ещё то-то и то-то". Во втором случае вам намного-намного скорее помогут. А в первом скорее пошлют, и хорошо, если в гугл.

В общем, вот, наклепал исключительно из желания мозги размять немного. Но было бы неплохо задачу формулировать поопределённее, в первую очередь для себя.


#include <stdio.h>

#define STR(NAME, STRING, NUM, BYTES...) struct { char bytes[NUM]; char string[sizeof(STRING)]; \
                                         } NAME##_tmp_s = {{BYTES}, STRING}; \
                                         char *NAME = (char*)&NAME##_tmp_s

#define VAR1 35 /* то же, что и '#' */
#define VAR2 32 /* то же, что и ' ' */

int main()
{
  STR(str, "hello", 2, VAR1, VAR2); /* получим аналог char *str = "# hello"; */
  STR(str2, "hello", 1, VAR1);      /* получим аналог char *str2 = "#hello"; */
  printf("'%s'\n", str);
  printf("'%s'\n", str2);
  return 0;
}


Собственно, отсюда вам нужен только первый макрос, остальное - тест. Но если и это не спасёт отца русской демократии, то вы уж как-нибудь сами...
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Си - вставить число в строку символов (спасите мозг!)"  +/
Сообщение от pollymer email on 20-Янв-10, 01:36 
Спасибо! Это то что надо!

>Более сюрреалистической и бессмысленной задачи представить сложно. Практика показывает, что если задача
>сформулирована путанно и выглядит странно,

Отнюдь. Ведь все было понято правильно!

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру