web-dev-qa-db-fra.com

Macro pour concaténer deux chaînes en C

J'essaie de définir une macro supposée prendre deux valeurs de chaîne et les renvoyer concaténées avec un espace entre elles. Il semble que je puisse utiliser n'importe quel caractère que je veux en dehors de l'espace, par exemple:

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2

space_conc(idan,oop);

space_conc retournerait "idan-oop"

Je veux quelque chose à retourner "idan oop", des suggestions?

21
Idan

Essaye ça

#define space_conc(str1,str2) #str1 " " #str2

Le '##' est utilisé pour concaténer des symboles, pas des chaînes. Les chaînes peuvent simplement être juxtaposées en C et le compilateur les concaténera, comme le fait cette macro. First transforme str1 et str2 en chaînes (disons "bonjour" et "monde" si vous l'utilisez comme ceci space_conc(hello, world)) et les place les unes à côté des autres avec la chaîne simple, à un seul espace, entre les deux. C'est-à-dire que l'extension résultante serait interprétée par le compilateur comme ceci

"hello" " " "world"

auquel il va concaténer

"hello world"

HTH

Modifier
Pour être complet, l’opérateur '##' dans le développement de macro est utilisé comme ceci, supposons que vous ayez

#define dumb_macro(a,b) a ## b

entraînera ce qui suit si appelé comme dumb_macro(hello, world)

helloworld

ce qui n'est pas une chaîne, mais un symbole et vous obtiendrez probablement une erreur de symbole non définie indiquant que 'helloworld' n'existe pas, à moins que vous ne le définissiez au préalable. Ce serait légal:

int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
48
falstro
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
5
Andreas Bonini

Le droit était de placer les 2 cordes l'une à côté de l'autre. "##" ne fonctionnera pas. Juste:

#define concatenatedstring string1 string2
0