J'ai 6 noms, et je voudrais les mettre dans un tableau
Je le rends de cette façon p> Voici une sortie p> aussi loin que je comprenne, j'ai besoin de mettre \ 0 code> ce signe à la fin de chaque ligne ... mais comment Pour le mettre dans mon cas? p> p>
3 Réponses :
Vous devez avoir des zéros à la fin de chaque chaîne. P>
@Alekseytimoshchenko Vous avez copié 4 octets de chaque chaîne, mais les chaînes sont en réalité de 5 octets, y compris l'octet nul.
Oui. Exactement à la fin de chaque string b>. La taille de "1234" est 5 à cause de cette fin de zéro
MEMCY a suivi de la signature suivante:
char set_names_arr[COUNT_OF_SETS][5];
Il convient également de noter que tailleof () code> ne "calculule" rien. Cela fonctionne dans ce cas car le littéral à chaîne a une longueur connue au moment de la compilation et est une gamme de caractères, que taille de code> renvoie la taille totale de la matrice. Cependant, ce serait vraiment pas i> travailler si vous venez de donner un pointeur sur une chaîne de Char code> S, qui "calculer" peut impliquer. Dans ce cas, nous obtenons uniquement la taille code> l'adresse de la mémoire dans ce pointeur. Donc, cela ne fonctionnerait pas pour les chaînes dont la longueur ne peut pas être connue au moment de l'exécution, sans appeler une fonction pour compter à travers leurs octets jusqu'à atteindre un nul code>.
Donc, diriez-vous que nous devrions préférer strlen + 1 code> sur taille de code>?
Tailleof (String_Literal) Code> est bien, mais Tailleof (ONE_RANDOM_CHAR_STAR) code> n'est pas. Il s'agit donc de savoir quel code fait la bonne chose dans quel contexte. Oui, std :: strlen () code> fonctionnera dans les deux cas, mais pour les tableaux de caractère dont la taille est connue au moment de la compilation, c'est un gaspillage de cycles.
Mais, strlen (string_literal) code> et Tailleof (string_literal) code>, les deux seront convertis en constantes par compilateur moderne, réduisant ainsi tout besoin réel de taille de code> .
Mais quand j'essaie ce memcpy (& set_names_arr [0] [start_point], SETA_NAME, TIZEOFOF (SETA_NAME)); CODE> I Obtenir 'MemCy' Will débit toujours; La mémoire tampon de destination a la taille 4, mais l'argument de taille est 5 code>
@ E.n.d ils pourraient. Avez-vous testé que tout chaque "compilateur moderne" fait cela? Si oui, génial! Je ne pense toujours pas std :: strlen () code> et son #include code> sont nécessaires pour les billets de chaîne / charcuterie. Mais bien sûr, si vous voulez être sûr, avec tout risque de compter peut-être des personnages lorsque nous n'avons pas besoin de, allez-y; La sécurité est préférable à ce qui pourrait être une optimisation prématurée.
@AlekseyTimoshchenko Vous avez mentionné longueur_of_set_name code> est 4, plus tard sur. Mise à jour de ma réponse.
Y a-t-il un moyen d'introduire ce tableau avec mes valeurs? Ou de toute façon je dois utiliser cette méthode memcpy ()?
@AlekseyTimoshchenko Nope, utilisez ceci: Char * Set_names_arr [Nombre_OF_sets] = {"SETA", "SETB", "SETC", "SETD", "SETF"}; code>
Peut-être const char * const set_names_arrrs [] = ... code> serait mieux. Voir mon post
Changer à p> pour permettre le caractère null à l'extrémité de la chaîne p> edit forte> p> pourrait faire cela ... p> ou p>
Y a-t-il un moyen d'introduire ce tableau avec mes valeurs? Ou de toute façon, je dois utiliser cette méthode memcpy () code>?
@Alekseytimoshchenko voir ci-dessus
@Alekseytimoshchenko - Veuillez rechercher l'utilisation de const code>
Avez-vous du mal à comprendre où il devrait y avoir un \ 0?
De plus, si vous voulez
nul code> octets de votre chaîne, puis copiez-les, en copiant le nombre de caractères "code"+ 1 code> et ajustez vos compensations suivantes en conséquence. Les littéraux de chaîne obtiennent déjànul code> à la fin, il est donc là pour que vous puissiez copier.#define longueur_of_set_name 4 code> ->#define longueur_of_set_name 5 code>. Ou utilisezStrcpy code>.... ou zéro initialisez votre matrice de destination, ce qui est juste une bonne pratique, puis copiez 4 octets dans chaque position, laissant un 0 entre chacun. Il y a beaucoup de façons de faire cela, et ils ne sont pas trop difficiles à imaginer.