C - lire la chaîne de caractères à partir de la mémoire tampon de taille
J'ai un char buf[x], int s et void* data.
Je veux écrire une chaîne de caractères de taille s en buf.
Comment dois-je faire?
Merci d'avance.
Est
notez que la caf a relevé plusieurs erreurs dans ma réponse. J'ai édité ma réponse tenant compte de ses commentaires.
buf
null délimité par des cordes ou des est sa taille définie par s
? Êtes-vous essayer de copier une partie de la chaîne? Qu'est-ce que x
? La chaîne copiée à data
doivent être null délimité? Qu'avez-vous essayé jusqu'à présent?notez que la caf a relevé plusieurs erreurs dans ma réponse. J'ai édité ma réponse tenant compte de ses commentaires.
OriginalL'auteur yper | 2010-07-18
Vous devez vous connecter pour publier un commentaire.
En supposant que
data
;Abord, vous avez besoin d'allouer de la mémoire dans
data
. N'oubliez pas la salle pour la0
octet à la fin de la chaîne.En supposant
malloc
réussit, vous pouvez maintenant copier les octets.MODIFIER:
La meilleure fonction pour le travail, comme l'a souligné par la caf, est
strncat
. (Il est entièrement portable, qui fait partie de C89.) Il ajoute à la chaîne de destination, afin d'organiser pour la destination à être une chaîne vide à l'avance:Autre inférieur possibilités, garder ici à titre d'exemples de fonctions connexes:
Si vous avez
strlcpy
(qui n'est pas du C standard, mais est commun sur les systèmes Unix modernes; il y a du domaine public implémentations flottant autour):Si vous savez qu'il y a au moins
s
caractères dans la chaîne source, vous pouvez utilisermemcpy
:((char*)données)[s+1] = 0;
Sinon, vous pouvez calculer la longueur de la chaîne source première:
Ou vous pouvez utiliser
strncpy
, mais il est inefficace si la longueur réelle de la chaîne source est beaucoup plus petite ques
:memcpy()
implémentations ont des bugs - ils à la fois lieu le nul de terminaison incorrecte, et ils essaient de déréférencer unvoid *
, que vous ne pouvez pas le faire. Le premier devrait utiliser((char *)data)[s] = 0
, et le second devrait utiliser((char *)data)[bytes_to_copy] = 0;
. Pour la dernière, au lieu destrncpy()
vous pouvez utiliserstrncat()
:((char *)data)[0] = 0; strncat(data, buf, s);
vous avez raison sur les deux points. Malheureusement, ma réponse a été accepté, donc j'ai édité, plutôt que de le supprimer parce que je ne veux pas laisser une mauvaise réponse trop visible. Mais si vous écrivez un strncat réponse, je vais upvote.
OriginalL'auteur Gilles
Si
data
n'est pas alloué:En fait, si les données sont vraiment à être défini, vous pouvez également faire
malloc(strlen(buf)+1)
Ne sont pas les littéraux de chaîne déjà null?
Oui, et ici
buf
est terminée par null même si ce n'est pas un littéral de chaîne. Maisstrlen(buf)
ne comprend pas l'octet de terminaison dans son décompte.Vous pouvez utiliser
sizeof buf
au lieu destrlen(buf)+1
ici depuisbuf
est un tableau.OriginalL'auteur Jack
Cela suppose que vous avez suffisamment d'espace dans les données (et dans buf).
En fonction de ce que vous faites (vous ne dites pas, mais vous dites que vous êtes copie de chaînes de caractères), vous pouvez ajouter une valeur null à la fin de votre nouvellement copié chaîne si vous n'avez pas copier une valeur null déjà en buff, et vous vous apprêtez à utiliser les données dans une fonction qui attend les chaînes.
OriginalL'auteur deinst
OriginalL'auteur Jacob
OriginalL'auteur bjg