C/Napisy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Bartem (dyskusja | edycje)
Anulowanie wersji nr 185126 utworzonej przez 83.30.43.150 (dyskusja)||Logowanie
Lethern (dyskusja | edycje)
Linia 193:
</source>
 
I ponownie jak w przypadku strcpy istnieje funkcja [[C/strncat|strncat]], która skopiuje co najwyżej tyle bajtów ile podano jako trzeci argument i ''dodatkowo'' dopisze znak null. Przykładowo powyższy kod bezpieczniej zapisać jako:
 
<source lang="c">
#include <stdio.h>
Linia 201 ⟶ 200:
int main(void) {
char napis1[80] = "hello ";
const char *napis2 = "world";
strncat(napis1, napis2, 2);
puts(napis1);
return 0;
}
</source>
 
hello wo
 
Możemy też wykorzystać trzeci argument do zapewnienia bezpiecznego wywołania funkcji kopiującej. W przypadku zbyt małej tablicy skopiowany zostanie fragment tylko takie długości, na jaki starczy miejsca (uwzględniając, że na końcu trzeba dodać znak '\0')
<source lang="c">
#include <stdio.h>
#include <string.h>
int main(void) {
char napis1[10] = "hello ";
const char *napis2 = "world";
strncat(napis1, napis2, sizeof napis1 - 1);
Linia 207 ⟶ 222:
}
</source>
 
hello wor
 
 
{{uwaga|Osoby, które programowały w językach skryptowych muszą bardzo uważać na łączenie i kopiowanie napisów. Kompilator języka C nie wykryje nadpisania pamięci za zmienną łańcuchową i nie przydzieli dodatkowego obszaru pamięci. Może się zdarzyć, że program pomimo nadpisywania pamięci za łańcuchem będzie nadal działał, co bardzo utrudni wykrywanie tego typu błędów!}}