|
C, вставить символ внутри строки |
|
|
|
Apr 26 2013, 12:40
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Допустим, есть строка Код static const uint8_t *TestText = "Test string"; Хочу вставить в середину специальный символ, допустим \x18. Откуда он возьмется, не важно (сам нарисую). Это можно сделать так: Код static const uint8_t *TestText = "Test\x18string"; Но мне не нравятся эти ничего не говорящие числа. Как можно подменить с помощью #define символ, чтобы принимался внутри строки? И попутно, как вставить символ, например, 'A', внутрь строки?
|
|
|
|
|
Apr 26 2013, 12:50
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Код #define MY_SYMBOL_NAME "\x18" static const uint8_t *TestText = "Test" MY_SYMBOL_NAME "string"; Строковые литералы идущие подряд через withespace склеиваются компилятором в один литерал. Так можно засунуть дефайн внутрь строки, но в дефайне может быть только строковый литерал.
|
|
|
|
|
Apr 26 2013, 13:24
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(neiver @ Apr 26 2013, 15:50)  Код #define MY_SYMBOL_NAME "\x18" static const uint8_t *TestText = "Test" MY_SYMBOL_NAME "string"; Получилось, спасибо! И без пробелов тоже склеилось. Цитата(winipuh @ Apr 26 2013, 15:52)  Или еще есть оператор препроцессора # - "превращения" в строку. И как применить...? Если внутри строки написать "Test"#MY_SYMBOL"string", Keil ругается error: #10: "#" not expected here
|
|
|
|
|
Apr 26 2013, 13:30
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ViKo @ Apr 26 2013, 17:24)  Получилось, спасибо! И без пробелов тоже склеилось.
И как применить...? Если внутри строки написать "Test"#MY_SYMBOL"string", Keil ругается error: #10: "#" not expected here ## Правда, результат в данном случае будет не такой, как надо. Вот если использовать вложенные макросы, типа #define CONCAT(a,b ) a##b тогда можно попробовать CONCAT("Test", MY_STRING)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 26 2013, 18:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Тут вот еще какая засада. Хотел спецсимволы описать в перечислении, вместо #define. Код typedef enum { S_BKL = 0x10, S_GND, ... } SYM_t; Но это будут уже не строковые константы, а числа. Если добавить # - Кейл ругается (уже писал). Если взять в кавычки - так и уйдут на вывод "S_GND". Так что, возможно, MrYuran прав. Но проще, похоже, описать дефайнами каждый символ в виде строки.
|
|
|
|
|
Apr 27 2013, 20:37
|

Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 31-10-12
Пользователь №: 74 189

|
Проблема тут в том, что Вы хотите выполнить конкатенацию строки с символом ("abcd" + '2'), а в си этого не предусмотрено. Хотя если погуглить - видно что Вы не единственный такой в мире.  Вот пример (правда похоже, что не рабочий). Задачу, наверное, Вы сможете решить только придумаете как средствами препроцессора разбить строку на массив символов ( попытки также можно найти в инете), плюс использование составных литералов, которые появились в С99: Код #include <stdio.h> int main(void) { enum spec_symb_t { PLUS = 0x2b, MINUS = 0x2d }; puts("+-"); puts((const char[]) {PLUS, MINUS, '\0'}); return 0; } Попутно у меня к Вам возникает встречный вопрос - ради чего такая акробатика в коде?  Вы где и как это предполагаете использовать? p.s. может быть здесь сможете что-то найти...
|
|
|
|
|
Apr 29 2013, 04:27
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(winipuh @ Apr 27 2013, 23:37)  Проблема тут в том, что Вы хотите выполнить конкатенацию строки с символом ("abcd" + '2'), а в си этого не предусмотрено. Так уже выяснили,что можно склеивать строки. А строка из одного символа - такая же полноправная строка. Замечательно, что при склейке строк промежуточные нули уничтожаются. Этого механизма мне достаточно. Цитата Попутно у меня к Вам возникает встречный вопрос - ради чего такая акробатика в коде?  Вы где и как это предполагаете использовать? Уже использую, в своем изделии. Сам шрифт создал, сам и текст вывожу, на свой же ЖКИ. Например, S_DELTA"X=". До этого символы, не входящие в ANSI набор, рисовал отдельно, в отдельном массиве. Теперь решил объединить со стандартными, все равно первые 32 места "пропадают".
|
|
|
|
|
Apr 29 2013, 11:26
|

Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 31-10-12
Пользователь №: 74 189

|
Цитата(ViKo @ Apr 29 2013, 08:27)  Так уже выяснили,что можно склеивать строки. А строка из одного символа - такая же полноправная строка. Замечательно, что при склейке строк промежуточные нули уничтожаются. Этого механизма мне достаточно. Вы меня не поняли. Чуть ранее Вы говорили о использовании enum вместо define (о чем Вы говорили чуть ранее). Мой опус был посвящен именно этому. И в этой связи речь шла о проблеме склейки строковой константы с символьной константой, а не о склейке двух строк... Если бы знал, что уже Вы уже вариант с enum отбросили и остановились на использовании #define
Сообщение отредактировал winipuh - Apr 29 2013, 11:28
|
|
|
|
|
Apr 29 2013, 12:04
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Если сильных возражений не будет, то хотелось бы в этой теме пролить свет и на такой момент: Задача передать в параметрах компиляции строку. Не получается( Число передать можно. Например, Код SW_VER_BUILD = 1005 COMPILE_OPTS = $(CPU_OPTS) -fpack-struct -Wpadded -g -O$(OPT) -DSW_VER_BUILD=$(SW_VER_BUILD) А вот строку - никак (и я скорее всего понимаю почему не получается). Но может есть варианты?
|
|
|
|
|
Apr 29 2013, 13:49
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Можно и строку в кавычках в дефайн передать, только кавычки нужно экранировать. не знаю как в makefile с кавычками, но просто в командной строке Windows они экранируются символом \ Код gcc hello.cpp -o hello.exe -DMY_DEFINE=\"hello\" Соответственно макрос MY_DEFINE будет иметь значение "hello" - строковый литерал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|