Comment ajouter deux chaînes?
J'ai essayé name = "derp" + "herp";
, mais j'ai eu une erreur:
L'expression doit être de type intégral ou enum
C ne prend pas en charge les chaînes que certains autres langages ont. Une chaîne en C est juste un pointeur vers un tableau char
dont se termine par le premier caractère nul. Il n'y a pas d'opérateur de concaténation de chaîne dans C.
Utilisez strcat
pour concaténer deux chaînes. Vous pouvez utiliser la fonction suivante pour le faire:
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
Ce n'est pas le moyen le plus rapide de le faire, mais vous ne devriez pas vous en soucier maintenant. Notez que la fonction renvoie un bloc de mémoire allouée au tas à l'appelant et transmet la propriété de cette mémoire. C'est la responsabilité de l'appelant à free
la mémoire lorsqu'elle n'est plus nécessaire.
Appelez la fonction comme ceci:
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
Si vous êtes gêné par les performances, vous voudrez éviter d'analyser à plusieurs reprises les tampons d'entrée à la recherche du terminateur nul.
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
Si vous prévoyez de travailler beaucoup avec des chaînes, vous feriez peut-être mieux d'utiliser un autre langage prenant en charge les chaînes de manière de premier ordre.
return memcpy(result, s1, len1);
. Bien qu'il s'agisse d'une micro-optimisation ou au moins d'un peu de code golfique, de telles améliorations potentielles sur les opérations de base sur les cordes peuvent avoir une valeur étant donné leur grande utilisation.stpcpy
, qui renvoie un pointeur vers la fin de la première chaîne:strcpy(stpcpy(result, s1), s2);
la source
David Heffernan a expliqué le problème dans sa réponse et j'ai écrit le code amélioré. Voir ci-dessous.
Une fonction générique
Nous pouvons écrire une fonction variadique utile pour concaténer n'importe quel nombre de chaînes:
Usage
Production:
Nettoyer
Notez que vous devez libérer la mémoire allouée lorsque cela devient inutile pour éviter les fuites de mémoire:
la source
int len
->size_t len
commesize_t
c'est le bon type pour le code "taille". Aussi// room for NULL
->// room for null character
NULL
implique le pointeur nul.Je suppose que vous en avez besoin pour des choses ponctuelles. Je suppose que vous êtes un développeur PC.
Utilisez la pile, Luke. Utilisez-le partout. Ne pas utiliser malloc / gratuit pour les petites allocations, jamais .
Si 10 Ko par chaîne ne suffisent pas, ajoutez un zéro à la taille et ne vous inquiétez pas, - ils libéreront de toute façon leur mémoire de pile à la fin des étendues.
la source
snprintf(result, sizeof result, "%s %s %s", s1, s2, s3);
Vous devez utiliser
strcat
, ou mieux,strncat
. Google it (le mot-clé est "concaténation").la source
strncat()
c'est une fonction diaboliquement difficile à utiliser correctement. Rapidement, sans regarder le manuel, quelle longueur spécifiez-vousstrncat()
? Si vous avez dit "la longueur du tampon", vous venez de bien démontrer mon point de vue. Il a une interface contre-intuitive et lorsque vous avez suffisamment de données pour l'utiliser en toute sécurité, vous n'avez pas besoin d'utiliser la fonction en premier lieu - il existe d'autres alternatives plus rapides et plus efficaces (telles questrcpy()
oumemmove()
) qui pourraient être utilisées au lieu. Quasiment quelle que soit la question de «que dois-je utiliser», cestrncat()
n'est pas la réponse.Vous ne pouvez pas ajouter de littéraux de chaîne comme celui en C. Vous devez créer un tampon de taille de chaîne littérale un + chaîne littérale deux + un octet pour le caractère de terminaison nul et copier les littéraux correspondants dans ce tampon et également vous assurer qu'il est terminé par null . Ou vous pouvez utiliser des fonctions de bibliothèque comme
strcat
.la source
Sans extension GNU:
Alternativement avec l'extension GNU:
Voir malloc , gratuit et asprintf pour plus de détails.
la source
la source
Concaténer les chaînes
La concaténation de deux chaînes en C peut être effectuée d'au moins 3 façons: -
1) En copiant la chaîne 2 à la fin de la chaîne 1
2) En copiant la chaîne 1 et la chaîne 2 dans la chaîne 3
3) En utilisant la fonction strcat ()
la source
En C, vous n'avez pas vraiment de chaînes, en tant qu'objet générique de première classe. Vous devez les gérer comme des tableaux de caractères, ce qui signifie que vous devez déterminer comment vous souhaitez gérer vos tableaux. Une solution consiste à utiliser des variables normales, par exemple placées sur la pile. Une autre façon est de les attribuer dynamiquement en utilisant
malloc
.Une fois que vous avez trié, vous pouvez copier le contenu d'un tableau dans un autre, pour concaténer deux chaînes en utilisant
strcpy
oustrcat
.Cela dit, C a le concept de "chaînes littérales", qui sont des chaînes connues au moment de la compilation. Lorsqu'ils sont utilisés, ils seront un tableau de caractères placé en mémoire morte. Il est cependant possible de concaténer deux chaînes littérales en les écrivant l'une à côté de l'autre, comme dans
"foo" "bar"
, ce qui créera la chaîne littérale "foobar".la source
en utilisant memcpy
la source