-2
votes

(Concaténation) Ajouter 4 "Char *" Macros ensemble en C

J'ai quatre char * macros que je veux mettre ensemble, mais je n'ai vu que des réponses avec deux char * , y a-t-il un moyen de le faire?

Voici le code: xxx


2 commentaires

Les définies sont des littéraux de chaînes. Ils sont de type char [] . C'est-à-dire qu'ils sont des tableaux char . Donc, vous pouvez les utiliser de la même manière que vous faites pour char * .


Il y a quelques choses étranges sur votre code cependant. 1. Pourquoi faites-vous Strcpy pour s2 , s3 ? C'est inutile que chaque Strcpy écrase précédemment Strcpy . Peut-être que vous vouliez utiliser strcat même pour ceux-ci. 2. Les cordes semblent contenir des valeurs binaires (non-ASCII). En fonction de ce que vous essayez de réaliser ce n'est probablement pas la bonne chose à faire. En particulier, il n'est pas sûr d'utiliser de telles "chaînes" avec les fonctions de chaîne.


3 Réponses :


1
votes

Dans votre fonction Mise en œuvre, par exemple, le deuxième appel de Strcpy écrase la première chaîne de la matrice pointée par la variable chat .

Strcpy (chat, S1 ); Strcpy (chat, s2);

Je pense que vous voulez dire que vous voulez dire la suivante xxx

une approche plus efficace est la suivante xxx

comme pour ces macros xxx

puis les premières et les troisièmes macros contiennent des zéros de terminaison. Si vous souhaitez les copier dans la chaîne de destination, vous devez vous rendre à la fonction standard memcpy au lieu de Strcpy . Dans ce cas, la fonction peut ressembler à xxx

Cependant, il y aura un problème que la chaîne contient des caractères zéro incorporés. Donc, peut-être qu'il n'y ait aucun sens d'ajouter la chaîne de résultat avec la terminaison zéro.


7 commentaires

Peut-être const char * s1 -> const char * const s1 serait mieux? Idem pour les autres


Ne pas travailler pour les données présentées. (Il contient des caractères nul)


Comme @ikegami remarqua aucune de nos solutions ne fonctionnera que des littéraux à chaîne contiennent des zéros.


@ikegami Standard C String Fonctions Ne vérifiez pas si un pointeur transmis est égal à NULL. Il incombe au client de la fonction de garantir que les pointeurs passés ne sont pas égaux à NULL.


Je n'ai pas dit null , j'ai dit caractère nul ( u + 0000, '\ 0' ). SHLEN et d'autres fonctions de chaîne ne vont pas fonctionner.


@Vladfrommoscow Tous les littéraux de chaînes sont automatiquement résiliés. Le premier et le troisième contiennent deux zéros.


@Holyblackcat Oui, mais il semble qu'il veuille copier seulement quatre caractères des macros.



1
votes

depuis un code>, deux code>, trois code>, quatre code> sont des macros en expansinant directement sur les constantes de chaîne, vous pouvez simplement Faites ceci:

char result[] = "\x0C\x03\xD1\x00" "\xC1\x03\x1A\x0C" "\xA2\x1A\x0D\x00" "\xD4\x1C\x4C\x0A";


5 commentaires

Qu'en est-il de ce Char * One = "One"; Char * Two = "Deux"; Char * trois = "Trois"; Char * Quatre = "Quatre"; sera-t-il le même bon? Vous mettez du désordre dans la tête débutante


@P__J__ La question dit explicitement "Macros". Mais j'ai édité la réponse pour dire clairement que cela ne fonctionne que sur les macros.


Sohere vous avez des macros #define One (const caractère []) {"asdfg"} #define deux (const caractère []) {"12345"} #define trois (const char []) {"@ # $% %% ^ "} #define quatre (const caractère []) {" zxcv "} Votre solution est-elle bonne?


@P__j____ oh bien, j'ai changé le libellé pour être encore plus précis. Je suis sûr que par " char * macros" op signifie "macros en expansion aux constantes de chaîne".


@P__J____: Char * one = "One"; se développera à une erreur de syntaxe bizarre (erreur : identifiant attendu ou '(' ), qui enseignera la leçon À propos de Macros :) Voir GODBOLT.ORG/Z/PJUF5P



1
votes

Compte tenu de la présence de caractères nul, ce ne sont pas des cordes (car celles-ci sont nulées), des fonctions de chaîne telles que Strlen code> ne peuvent pas être utilisées, de sorte que la taille des matrices serait doit être transmis à la fonction de concaténation.

 size_t buf_size = sizeof(one two three four) - 1;
 char *buf = malloc(buf_size);
 memcpy(buf, one two three four, buf_size);


1 commentaires

J'étais à Pittsburgh il y a une semaine et je n'ai pas encore ajusté pour Jetlag :)