strcat și strncat în C

Lipește un șir la sfârșitul altui șir aflat într-un tablou destul de mare.

Sintaxă
#include <string.h>
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

Ce face strcat și strncat

strcat(dest, src) caută terminatorul lui dest și copiază acolo caracterele lui src, plus un nou '\0'. dest trebuie să conțină deja un șir valid (cel puțin "") și să aibă loc pentru ambele șiruri.

strncat(dest, src, n) adaugă cel mult n caractere din src și pune întotdeauna terminatorul. Atenție: n nu este mărimea lui dest, ci câte caractere mai adaugi. Spațiul liber este sizeof dest - strlen(dest) - 1.

Fiecare apel caută din nou sfârșitul lui dest, deci multe apeluri pe un șir lung sunt lente. Pentru texte compuse din mai multe bucăți, snprintf este de obicei mai clar.

Parametri

Parametru Descriere
dest Tablou cu un șir terminat în '\0', cu spațiu liber după el.
src Șirul adăugat.
n La strncat: numărul maxim de caractere adăugate (fără terminator).

Ce returnează

Pointerul dest.

Exemple

Exemplul 1: Construirea unei adrese

#include <stdio.h>
#include <string.h>

int main(void) {
    char adresa[64] = "Str. Lăpușneanu";
    strcat(adresa, ", ");
    strcat(adresa, "Iași");
    printf("%s\n", adresa);
    return 0;
}

Rezultat

Str. Lăpușneanu, Iași

Exemplul 2: strncat cu spațiul rămas calculat corect

Bufferul are 12 octeți. După „Ana ” mai sunt 7 locuri pentru caractere (al 12-lea octet este pentru terminator), deci numele este tăiat.

#include <stdio.h>
#include <string.h>

int main(void) {
    char salut[12] = "Ana ";
    size_t liber = sizeof salut - strlen(salut) - 1;
    strncat(salut, "Mariaaaaaaaaa", liber);
    printf("[%s] (%zu caractere)\n", salut, strlen(salut));
    return 0;
}

Rezultat

[Ana Mariaaa] (11 caractere)

Greșeli frecvente

  • Folosești strcat pe un tablou neinițializat: char s[20]; strcat(s, "x");. Nu există un terminator de la care să înceapă; inițializează cu char s[20] = "";.
  • Pui la strncat mărimea tabloului (sizeof dest). Dacă tabloul are deja text, depășești spațiul.
  • Lipești un șir la el însuși (strcat(s, s)): zonele se suprapun și rezultatul este nedefinit.

Comenzi înrudite

  • strcpy, strncpy și strdup: Copiază un șir C într-un alt tablou (strcpy, strncpy) sau într-o zonă nouă alocată cu malloc (strdup).
  • strlen: Numără caracterele unui șir C până la terminatorul ‘\0’, fără să-l includă.
  • snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
  • Șiruri de caractere (char[]): În C, un șir de caractere este un tablou de char terminat cu caracterul nul ‘\0’, care marchează sfârșitul textului.