stpncpy(3)

NUME
stpncpy, strncpy - umple o memorie tampon de mărime fixă cu octeți nenuli dintr-un șir de caractere, umplând cu octeți nenuli după cum este necesar

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <string.h>

char *strncpy(char dst[restrict .dsize], const char *restrict src,
              size_t dsize);
char *stpncpy(char dst[restrict .dsize], const char *restrict src,
              size_t dsize);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

stpncpy():
    Începând cu glibc 2.10
        _POSIX_C_SOURCE >= 200809L
    Înainte de glibc 2.10:
        _GNU_SOURCE

DESCRIERE
Aceste funcții copiază octeți nenuli din șirul indicat de src în matricea indicată de dst. În cazul în care sursa are prea puțini octeți nenuli pentru a umple destinația, funcțiile umplu destinația cu octeți nenuli la sfârșit. În cazul în care memoria tampon de destinație, limitată de dimensiunea sa, nu este suficient de mare pentru a conține copia, secvența de caractere rezultată este trunchiată. Pentru a vedea diferența dintre cele două funcții, consultați secțiunea VALOAREA RETURNATĂ.

O implementare a acestor funcții ar putea fi:

    char *
    strncpy(char *restrict dst, const char *restrict src, size_t dsize)
    {
        stpncpy(dst, src, dsize);
        return dst;
    }

    char *
    stpncpy(char *restrict dst, const char *restrict src, size_t dsize)
    {
        size_t  dlen;

        dlen = strnlen(src, dsize);
        return memset(mempcpy(dst, src, dlen), 0, dsize - dlen);
    }

VALOAREA RETURNATĂ

strncpy()
    returnează dst.

stpncpy()
    returnează un indicator la un octet după ultimul caracter din secvența de caractere de destinație.

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
stpncpy(), strncpy() | Siguranța firelor | MT-Safe

STANDARDE

strncpy()
    C11, POSIX.1-2008.

stpncpy()
    POSIX.1-2008.

ISTORIC

strncpy()
    C89, POSIX.1-2001, SVr4, 4.3BSD.

stpncpy()
    glibc 1.07. POSIX.1-2008.

AVERTISMENTE
Numele acestor funcții este confuz. Aceste funcții produc o secvență de caractere cu umplutură nulă, nu un șir de caractere (a se vedea string_copying(7)). De exemplu:

    strncpy(buf, "1", 5);       // { '1',   0,   0,   0,   0 }
    strncpy(buf, "1234", 5);    // { '1', '2', '3', '4',   0 }
    strncpy(buf, "12345", 5);   // { '1', '2', '3', '4', '5' }
    strncpy(buf, "123456", 5);  // { '1', '2', '3', '4', '5' }

Este imposibil să se facă distincția între trunchiere prin rezultatul apelului și o secvență de caractere care se potrivește cu memoria tampon de destinație; trunchierea ar trebui detectată prin compararea lungimii șirului de intrare cu dimensiunea memoriei tampon de destinație.

Dacă aveți de gând să utilizați această funcție în apeluri înlănțuite, ar fi util să dezvoltați o funcție similară care să accepte un indicator la capătul (un octet după ultimul element) al memoriei tampon de destinație în loc de dimensiunea acesteia.

EXEMPLE
    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int
    main(void)
    {
        char    *p;
        char    buf1[20];
        char    buf2[20];
        size_t  len;

        if (sizeof(buf2) < strlen("Salutare lume!"))
            errx("strncpy: truncating character sequence");
        strncpy(buf2, "Salutare lume!", sizeof(buf2));
        len = strnlen(buf2, sizeof(buf2));

        printf("[len = %zu]: ", len);
        fwrite(buf2, 1, len, stdout);
        putchar('\n');

        if (sizeof(buf1) < strlen("Salutare lume!"))
            errx("stpncpy: truncating character sequence");
        p = stpncpy(buf1, "Salutare lume!", sizeof(buf1));
        len = p - buf1;

        printf("[len = %zu]: ", len);
        fwrite(buf1, 1, len, stdout);
        putchar('\n');

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
wcpncpy(3), string_copying(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.