0
votes

Pourquoi je reçois tous les noms dans une ligne lorsque vous avez lu?

J'ai 6 noms, et je voudrais les mettre dans un tableau

Je le rends de cette façon xxx xxx

Voici une sortie xxx

aussi loin que je comprenne, j'ai besoin de mettre \ 0 ce signe à la fin de chaque ligne ... mais comment Pour le mettre dans mon cas?

c

4 commentaires

Avez-vous du mal à comprendre où il devrait y avoir un \ 0?


De plus, si vous voulez nul octets de votre chaîne, puis copiez-les, en copiant le nombre de caractères "code" + 1 et ajustez vos compensations suivantes en conséquence. Les littéraux de chaîne obtiennent déjà nul à la fin, il est donc là pour que vous puissiez copier.


#define longueur_of_set_name 4 -> #define longueur_of_set_name 5 . Ou utilisez Strcpy .


... 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.


3 Réponses :


0
votes

Vous devez avoir des zéros à la fin de chaque chaîne.


2 commentaires

@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 . La taille de "1234" est 5 à cause de cette fin de zéro



2
votes

MEMCY a suivi de la signature suivante:

  char set_names_arr[COUNT_OF_SETS][5]; 


10 commentaires

Il convient également de noter que tailleof () 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 renvoie la taille totale de la matrice. Cependant, ce serait vraiment pas travailler si vous venez de donner un pointeur sur une chaîne de Char S, qui "calculer" peut impliquer. Dans ce cas, nous obtenons uniquement la taille 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 .


Donc, diriez-vous que nous devrions préférer strlen + 1 sur taille de ?


Tailleof (String_Literal) est bien, mais Tailleof (ONE_RANDOM_CHAR_STAR) n'est pas. Il s'agit donc de savoir quel code fait la bonne chose dans quel contexte. Oui, std :: strlen () 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) et Tailleof (string_literal) , les deux seront convertis en constantes par compilateur moderne, réduisant ainsi tout besoin réel de taille de .


Mais quand j'essaie ce memcpy (& set_names_arr [0] [start_point], SETA_NAME, TIZEOFOF (SETA_NAME)); I Obtenir 'MemCy' Will débit toujours; La mémoire tampon de destination a la taille 4, mais l'argument de taille est 5


@ 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 () et son #include 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 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"};


Peut-être const char * const set_names_arrrs [] = ... serait mieux. Voir mon post



2
votes

Changer xxx

à xxx

pour permettre le caractère null à l'extrémité de la chaîne

edit

pourrait faire cela ... xxx

ou xxx < / p>


3 commentaires

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 voir ci-dessus


@Alekseytimoshchenko - Veuillez rechercher l'utilisation de const