0
votes

Définissez une chaîne pour égaler une autre chaîne sans

Comment faire 2 chaînes égales les unes les autres en C sans utiliser code>? La manière la plus évidente que j'ai à l'esprit est ci-dessous, mais elle soulève une erreur d'initialiseur non valide.

Par exemple: P>

    char str1[100] = "This is a string";
    char temp[100] = str1;

c

1 commentaires

J'utilise habituellement memcpy moi-même parce que certains compilateurs lancent des avertissements sur Strcpy


3 Réponses :


2
votes

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 Strcpy < / code> : xxx

et pour obtenir une déclaration appropriée de strcpy Vous devez inclure < / code>. Il n'y a aucun moyen de le faire (à moins que vous ne souhaitiez écrire votre propre fonction Strcpy -Il fonction que je recommande fortement).

Vous pouvez bien sûr copier tout le tableau, y compris tous Le contenu ininitialisé, utilisant MEMCY , Mais il est également déclaré dans .


6 commentaires

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 . Il n'y a aucun moyen de le contourner ... »: Per C 2018 7.1.4 2, il est permis de déclarer vous-même une bibliothèque vous-même, sans y compris son en-tête.


@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 , et depuis C99 la déclaration "appropriée" est avec restreindre 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.)



2
votes

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';


1 commentaires

Ou transformez-le en un do * q ++ = * p; tandis que (* p ++); et copier le caractère Nul-terminant dans la boucle. :)



0
votes

Si vous souhaitez copier une chaîne à une autre sans utiliser Vous devez exécuter une boucle à partir de la première position de STR1 jusqu'à ce que vous avez trouvé < Code> '\ 0' et copiez chaque élément sur TEMP . N'oubliez pas d'ajouter un '\ 0' à la fin de TEMP ou vous verrez une valeur détruite tout en l'imprimant. xxx


0 commentaires