Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

13.3.1 strcpy ja strncpy

Esimerkiksi strcpy:n käyttö on erittäin vaarallista, mikäli merkkijono jonne kopioidaan jää pienemmäksi kuin mitä kopioidaan. Tällöin kopioidaan seuraavien muistialueiden päälle. Esimerkiksi saattaisi olla:

c-taul\strcpy.c - esimerkki tilan ylityksestä

	char jono1[6],jono2[6]; 
	...
	strcpy(jono2,"Koira");
	strcpy(jono1,"Kissa on!");
	...
	printf("%s %s\n",jono1,jono2); /* - > Kissa on! on! */
	
	                           +-----jono2
	jono1                      v
	  |      0  1  2  3  4  5  0  1  2  3  4  5 
	  |    +-----------------------------------+ 
	  +--->|4B|69|73|73|61|20|6F|6E|21|00|61|00|
	       +-----------------------------------+
	        K  i  s  s  a     o  n  !  NUL a NUL 

Edellä jono2:n pilaaminen voitaisiin estää kutsulla strncpy:

	char jono1[6],jono2[6];
	...
	strncpy(jono2,"Koira",6);
	strncpy(jono1,"Kissa on!",6);
	...
	printf("%s %s\n",jono1,jono2); /* - > Kissa Koira Koira */
	
	                           +-----jono2
	jono1                      v
	  |      0  1  2  3  4  5  0  1  2  3  4  5 
	  |    +-----------------------------------+ 
	  +--->|4B|69|73|73|61|20|6B|6F|69|72|61|00|
	       +-----------------------------------+
	        K  i  s  s  a     K  o  i  r  a  NUL 

Vikana on kuitenkin edelleen se, että nyt strncpy ei laita NUL merkkiä jonon loppuun, mikäli käsittely lopetetaan maksimipituuden takia!

Usein tämä varmistetaan laittamalla NUL-merkki varmuuden vuoksi kopioinnin jälkeen:

	...
	strncpy(jono1,"Kissa on!",6);
	jono1[6- 1] = 0;
	...
	                           +-----jono2
	jono1                      v
	  |      0  1  2  3  4  5  0  1  2  3  4  5 
	  |    +-----------------------------------+ 
	  +--->|4B|69|73|73|61|00|6B|6F|69|72|61|00|
	       +-----------------------------------+
	        K  i  s  s  a  NULK  o  i  r  a  NUL 

Tehtävä 13.120 kopioi_jono

Kirjoita aliohjelma
int kopioi_jono(char *tulos, int max_koko, const char *jono)
joka kopioi merkkijonon jono paikkaan tulos, muttei ylitä tulos- jonon maksimipituutta max_pit. tulos jono loppuu aina NUL-merkkiin. Funktio palauttaa 0 mikäli kopiointi onnistuu kokonaan ja muuten jonkin muun arvon.

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys