Comment voulez-vous effectuer une itération sur un tableau de tableaux de caractères en c?
Avez-vous manuellement boucle sur le tableau une fois et d'obtenir un nombre de strlen () de chaque tableau de caractères, en somme, d'allouer de destination avec un résumé de la valeur et puis boucle sur le tableau de nouveau?
Comment trouvez-vous la taille de la matrice qui contient les tableaux de caractères de sorte que vous pouvez parcourir?
Un peu de code nous aide à comprendre ce que c'est que vous demandez.
On dirait que vous voulez copier le tableau de chaînes C. Est ce que le droit?
Je veux finalement concaténer les chaînes dans le tableau en une chaîne unique. Besoin de savoir combien d'espace mémoire à allouer pour la chaîne de destination. Je ne comprends pas comment vous savez quoi mettre comme la condition de fin de la boucle for, c'est à dire que la longueur du tableau est.
On dirait que vous voulez copier le tableau de chaînes C. Est ce que le droit?
Je veux finalement concaténer les chaînes dans le tableau en une chaîne unique. Besoin de savoir combien d'espace mémoire à allouer pour la chaîne de destination. Je ne comprends pas comment vous savez quoi mettre comme la condition de fin de la boucle for, c'est à dire que la longueur du tableau est.
OriginalL'auteur Walt Weidner | 2012-01-28
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons:
char*
à la fin du tableau et de stocker un pointeur null en elle comme une sentinelle, semblable à la manière d'un caractère NUL est utilisé pour mettre fin à une chaîne.En d'autres termes, vous avez à faire votre propre comptabilité lors de l'attribution de la matrice car C ne vous donnera pas l'information souhaitée. Si vous suivez la deuxième suggestion, vous pouvez obtenir le nombre total de caractères dans le tableau de chaînes de caractères avec
N'oubliez pas de réserver de l'espace pour un
'\0'
quand effectuer la concaténation.Besoin de retourner + 1, puisqu'elle est égale à zéro à la base non?
... ou tout simplement utiliser sizeof(tableau)/sizeof(entrée) pour obtenir la longueur si vous avez vraiment eu une matrice (et non un pointeur - ils ne sont PAS les mêmes). Beaucoup de gens (moi aussi depuis plus de 10 ans) pense que les tableaux et les pointeurs sont les mêmes, mais ils ne sont pas des tableaux sera juste automatiquement dégénérer à un pointeur, si nécessaire. par exemple, int a[10] ={0}; sizeof(a)/sizeof(int) donnera u 10 ; int *a=malloc(10*sizeof(int)); sizeof(a) == sizeof(int *) dans ce cas
OriginalL'auteur Fred Foo
Je suppose que vous êtes en essayant de faire une chaîne de caractères qui est la concaténation de toutes les chaînes dans le tableau.
Il y a 2 façons de le faire:
Faire 2 passes comme vous le suggérez, en additionnant les longueurs dans le premier passage, l'allocation de la chaîne de destination, et en ajoutant les chaînes dans le deuxième passage,
Faire 1 passe. Commencez par l'allocation de la mémoire tampon de taille. Ajouter les cordes, garder une trace de la taille totale. Si vous n'avez pas assez de place pour une chaîne de réallouer la mémoire tampon avec
realloc()
. La méthode la plus efficace de la redistribution sera le double de la taille de la mémoire tampon à chaque fois.OriginalL'auteur Martin Broadhurst
Je suppose que vous voulez concaténer des chaînes de caractères. Si oui, oui. Vous devez savoir combien d'espace vous voulez avant de vous l'attribuer.
En fait, vous pouvez utiliser
realloc
, mais c'est vraiment juste copier la chaîne précédente à chaque fois, et beaucoup moins efficace.Code : (en supposant que
char *s[]
etint n
)Edit: Comme certains commentaires,
strcat
est inefficace quand vous savez la longueur. (Je préfère encore car il allouer de la mémoire en une seule fois.) Certains plus efficace de code est:strcat
est extrêmement onéreux: il provoque l'algorithme à exécuter en O(n2) temps alors qu'il pourrait être linéaire.Comment peut-linéaire être accompli? @asaelr partie de ma question est de savoir comment déterminer ce n est dans ce cas.
OriginalL'auteur asaelr
Meta Stack Overflow s'il vous plaît ajouter une option pour accepter / REJETER ces faux blanc nazi modifications.
OriginalL'auteur wildplasser