2016-09-20 3 views
0

Comment concaténer deux chaînes par exempleComment concaténer deux chaînes avec beaucoup de caractères nuls?

char s[5]={'s','a','\0','c','h'}; 

char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 

qui a beaucoup de caractères nuls. J'ai essayé strcat(). Ça ne fonctionne pas. Y a-t-il un moyen?

+3

techniquement, un caractère nul termine une chaîne. utiliser l'arithmétique du pointeur et 'memcpy()' –

+2

Une chaîne terminée par un caractère nul ne contient qu'un seul caractère nul, qui est évidemment le dernier de la chaîne. –

+0

Il manque un '' \ 0'' à la fin de vos tableaux: par exemple: '{'s', 'a', '\ 0', 'c', 'h'};' -> '{' s ',' a ',' \ 0 ',' c ',' h ',' \ 0 '}, '. Sans cela, vous ne pouvez pas déterminer où se termine la dernière chaîne. En fait, vous avez besoin de deux "\ 0" pour que vous sachiez qu'il y a plus de chaînes. –

Répondre

4

C'est compliqué car, par définition, les chaînes C ont une terminaison nulle. Donc, ce que vous avez réellement, ce sont deux tampons octets que vous voulez assembler, pas deux cordes. (C'est pourquoi des fonctions comme strcat ne fonctionnent pas ici, d'ailleurs - ils attendent que leurs arguments soient des chaînes C.) vous pouvez avec C-cordes, vous devez connaître la taille des tampons à l'avance. Ensuite, il est aussi simple que peu-blitting les deux en un seul tampon:

char dest[16]; 
memcpy(dest,  s, 5); // Copy s to the final buffer 
memcpy(dest + 5, m, 11); // Copy m to the final buffer just after s 
+0

Upvoted pour fournir l'implémentation. – Bathsheba

+0

merci. Il a vraiment travaillé – Abu

0

Toutes les fonctions de chaîne de la bibliothèque standard C s'arrêteront sur le premier \0. C'est par conception. En fait, vos tableaux d'entrée vont fonctionner correctement avec de telles fonctions puisqu'ils ne se terminent pas par un \0.

Donc, la meilleure chose à faire est d'utiliser memcpy et de spécifier le nombre de caractères à copier. N'oubliez pas d'allouer la quantité de mémoire nécessaire dans le tampon de destination.

+1

S'ils ne s'arrêtent pas au premier octet NUL, ils ne sont pas des fonctions de chaîne. Ce n'est pas une question de conception, mais une convention/définition d'une chaîne dans C. – Olaf

0

La façon plus simple:

const int size_s = 5; 
const int size_m = 11; 
char s[size_s]={'s','a','\0','c','h'}; 
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char destination[size_s+size_m]; 
int i; 
for (i = 0;i < size_s;i++) 
    destination[i] = s[i]; 

for (i = 0;i < size_m;i++) 
    destination[i+size_s] = m[i]; 

Idéalement, vous devriez utiliser memcpy

const int size_s = 5; 
const int size_m = 11; 
char s[size_s]={'s','a','\0','c','h'}; 
char m[size_m]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char destination[size_s+size_m]; 

memcpy(destination,s,size_s); 
memcpy(destination,m,size_m); 
+1

destination + size_s pour la deuxième copie? – Bathsheba

0
char s[5]={'s','a','\0','c','h'}; 
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'}; 
char* e = (char*)malloc(sizeof(s) + sizeof(m)); 

memcpy(e, s, sizeof(s)); 
memcpy(&e[sizeof(s)], m, sizeof(m)); 

n'oubliez pas de supprimer la chaîne de résultat lorsque vous avez terminé.

free(e); 
+0

Un peu plus propre que ma réponse, mais sachez que sizeof sur un tableau est différent de sizeof sur un pointeur (et souvent lorsque vous traitez avec des tampons, vous n'aurez pas le tableau réel, juste un pointeur vers son premier élément). – Cameron

+1

'new char' ....' delete [] e; 'dans C? Comment? –

+0

Je sais, j'essayais juste d'écrire le moins de code possible. Je ne comprends pas pourquoi il veut faire ça pour commencer et même s'il avait une bonne raison, je l'aurais fait avec beaucoup plus de sécurité que ça. – Sam