-1
votes

C Raison pour laquelle Strncpy n'a pas de terminaison nulle

Je suis actuellement en train d'apprendre des chaînes en C et une question posée: pourquoi les développeurs C ne font-ils que Strncpy NULL s'est terminé automatiquement?

Par exemple dans la mise en œuvre de Strncpy, pourquoi les personnes qui fabriquent-elles le langage C ajoutent cette ligne: xxx

afin de rendre strncpy plus sûr?


6 commentaires

C'est un choix, vous pouvez également demander pourquoi met ajoute une dernière nouvelle ligne mais pas fputts etc.


Toutes les décisions de conception n'ont pas une explication qui satisfera tout le monde. Il y a strlcpy fwiw, mais ce n'est pas standard ...


Parce que Strncpy est utilisé dans des situations où vous pouvez pas vouloir 0-Terminez le résultat, tel que la nouvelle nouvelle partie d'une chaîne.


Comment seriez-vous capable d'identifier que vous n'étiez pas capable de copier toute la longueur du tampon source que vous aviez destiné à? Si le dernier caractère de votre tampon de destination est non-NULL, vous savez que la copie était incomplète.


La raison du folklore que je connaisse - mais je ne peux pas garantir sa véracité - a été informé ici . En d'autres termes, il s'agit d'une fonction à usage spécial datant de la suite lorsque c et Unix où il n'est pas clairement séparé qui n'aurait pas dû être traîné dans C au moment de la séparation.


Dupliqué possible de Pourquoi Strncpy pas NULL se termine?


3 Réponses :


0
votes

Il est résilié null si vous n'atteignez pas le compte. Voir la citation ci-dessous ( https://fr.cppreference.com/w/c/ String / octet / strncpy )

copies au plus de caractères de comptage de la matrice de caractères pointée par SRC (y compris le caractère null qui termine, mais pas l'un des caractères qui suivent le caractère null) au tableau de caractères pointus à par dest.

Il est seulement intacté si vous atteignez le compte avant de terminer le caractère null. Vous ne pouvez pas ajouter de caractère nul de terminer à la capacité car cela serait en dehors des limites de la matrice.

Vous voudrez peut-être examiner strlcpy qui fera ce que vous voulez mais ne fait pas partie de la bibliothèque standard.


2 commentaires

Juste ajouté que.


Op aking pourquoi il est écrit comme ça.



0
votes

C'est fait de cette façon, car vous voudrez peut-être écraser les premiers mots d'une phrase.


0 commentaires

3
votes

strncpy n'a jamais été destiné à être une "alternative sûre" à Strcpy , bien que c'est l'impression que beaucoup de nouveaux programmeurs de nouveaux C ont lieu depuis qu'il prend une "taille "Paramètre. Le troisième argument est destiné au nombre de caractères à lire à partir du tampon source, et non à la capacité maximale du tampon de destination.

Il y a peu de cas d'utilisation aujourd'hui pour lesquels strncpy est le meilleur choix pour Copier des données d'un tampon à un autre. Si vous avez besoin d'une alternative sûre au Strcpy , vous pouvez utiliser snaprintf comme: xxx


2 commentaires

"Le troisième argument est destiné au nombre de caractères à lire à partir du tampon source, et non à la capacité maximale du tampon de destination." <- Qu'est-ce qui vous fait penser que? Je ne pense pas, cette affirmation est soutenue par n'importe quoi.


@CTX Lire Cplusplus.com/reference/cstring/strncpy