Макрос для конкатенации двух строк в C
Я пытаюсь определить макрос, который предположил бы взять 2 строковых значения и вернуть их, объединенные одним пространством между ними. Кажется, я могу использовать любой персонаж, которого я хочу, помимо пространства, например:
#define conc(str1,str2) #str1 ## #str2 #define space_conc(str1,str2) conc(str1,-) ## #str2 space_conc(idan,oop);
space_conc
вернет «idan-oop»
Я хочу что-то вернуть «idan oop», предложения?
- Простой способ подсчета символов в строке
- Как подсчитать количество вхождений символа в String?
- Разделить строку на более мелкие строки по переменной длины
- Возможны ли параметры в strings.xml?
- Почему strncpy небезопасен?
- Как я могу начать новую активность Android с помощью строки?
- Как интерполировать строки?
- Передача строки по ссылке в Java?
- Получить строку между двумя строками в строке
- Как узнать, является ли первый символ строки числом?
- История за названием «String»
- fgets () включает в себя новую строку в конце
- Поиск всех позиций подстроки в большей строке в C #
Попробуй это
#define space_conc(str1,str2) #str1 " " #str2
«##» используется для конкатенации символов, а не строк. Строки могут быть просто сопоставлены в C, а компилятор будет их конкатенировать, что и делает этот макрос. Сначала он превращает str1 и str2 в строки (скажем, «привет» и «мир», если вы используете его как this space_conc(hello, world)
) и помещает их рядом друг с другом с помощью простого space_conc(hello, world)
строку. То есть, результирующее расширение будет интерпретироваться компилятором следующим образом:
"hello" " " "world"
который он объединит
"hello world"
НТН
редактировать
Для полноты оператора ‘##’ в расширении макроса используется, как это, скажем, у вас есть
#define dumb_macro(a,b) a ## b
приведет к следующему, если будет вызван как dumb_macro(hello, world)
helloworld
который не является строкой, а символом, и вы, вероятно, в конечном итоге получите неопределенное сообщение об ошибке, говорящее, что «helloworld» не существует, если вы не определяете его в первую очередь. Это было бы законным:
int helloworld; dumb_macro(hello, world) = 3; printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
#define space_conc(str1, str2) #str1 " " #str2 printf("%s", space_conc(hello, you)); // Will print "hello you"
Правильно было сделать это, чтобы поместить 2 строки один рядом друг с другом. «##» не будет работать. Просто:
#define concatenatedstring string1 string2