Comment faire 2 chaînes égales les unes les autres en C sans utiliser Par exemple: P> char str1[100] = "This is a string";
char temp[100] = str1;
3 Réponses :
Vous ne pouvez pas utiliser de matrice pour initialiser un autre tableau. Et vous ne pouvez pas utiliser l'affectation entre les tableaux non plus.
Le seul moyen est de faire une copie explicite d'un tableau à l'autre. Et pour les chaînes d'octets à résiliation null, alors la voie habituelle nous par le biais de et pour obtenir une déclaration appropriée de Vous pouvez bien sûr copier tout le tableau, y compris tous Le contenu ininitialisé, utilisant Strcpy < / code> : p> strcpy code> Vous devez inclure Strcpy CODE> -Il fonction que je recommande fortement). P> MEMCY code> , Mais il est également déclaré dans
Re "Vous ne pouvez pas utiliser de matrice pour initialiser un autre tableau": sauf pour les littéraux à chaîne. Un littéral à chaîne est (ou définit) un tableau pouvant être utilisé pour initialiser un autre tableau.
Re: "Et pour obtenir une déclaration appropriée de Strcpy, vous devez inclure
@ERICPOSTPISCHIL IIRC Lorsqu'il est utilisé comme initialiseur, le compilateur n'a pas à stocker le littéral de la chaîne lui-même à utiliser pour l'initialisation au moment de l'exécution.
@Ericpostpischil quant à la déclaration, l'argument source est déclaré avec const code>, et depuis C99 la déclaration "appropriée" est avec restreindre code> pour les deux arguments. Combien de choses se souviendront-ils que lors de la déclaration de la fonction elle-même?
Si le littéral de la chaîne doit être stocké ou non, n'est pas pertinent que c'est un tableau (ou, comme décrit en C 2018 6.4.5 6, définit un tableau), qui peut être utilisé dans une initiative pour initialiser un tableau ( 6.7.9 14 et 15). Semantiquement, un littéral à chaîne est un tableau qui peut être utilisé pour initialiser un tableau.
On n'est pas tenu de se rappeler tout lors de la programmation. Je me réfère souvent à des documents. Je ne jugé pas un jugement sur l'utilité de 7.1.4 2, je ne faisais que la dire, comme une question d'exactitude. (Mais je vais faire un jugement à ce sujet: il existe des occasions lorsqu'il est utile de déclarer une routine isolée et non d'inclure une en-tête complète.)
Vous pouvez faire quelque chose comme ça. Ne pas initialiser TEMP code>. Il suffit d'avancer les pointeurs vers les personnages jusqu'à ce que vous appuyez sur le terminateur NULL dans STR1. Cela sera moins efficace que la mise en œuvre Strcpy. char *p = str1;
char *q = temp;
while (*p)
*q++ = *p++;
*q = '\0';
Ou transformez-le en un do * q ++ = * p; tandis que (* p ++); code> et copier le caractère Nul-terminant i> dans la boucle. :) code>
Si vous souhaitez copier une chaîne à une autre sans utiliser STR1 code> jusqu'à ce que vous avez trouvé < Code> '\ 0' code> et copiez chaque élément sur TEMP code>. N'oubliez pas d'ajouter un '\ 0' code> à la fin de TEMP code> ou vous verrez une valeur détruite tout en l'imprimant.
J'utilise habituellement
memcpy code> moi-même parce que certains compilateurs lancent des avertissements surStrcpy code>