Kirjoittaja: Metabolix
Kirjoitettu: 31.07.2007 – 31.07.2007
Tagit: ohjelmointitavat, koodi näytille, vinkki
Tällä pienellä funktiolla voi yhdistää monta tekstinpätkää yhdeksi tekstiksi. Parametreja voi antaa haluamansa määrän, yhdistäminen loppuu ensimmäiseen NULL
-osoittimeen. Tämä lopetusehto kannattaa pitää mielessä, jos joskus ihmettelee, miksi yhdistetty teksti katkeaakin kesken kaiken: voi olla, että jokin parametreista onkin ollut NULL
-osoitin jo liian varhaisessa vaiheessa.
Funktio hakee parametrit stdarg
-otsikossa esiteltävillä makroilla, mittaa tekstien yhteispituuden, varaa malloc
-funktiolla oikean määrän muistia ja yhdistää tekstit. Funktion palauttama osoitin täytyy itse vapauttaa free
-funktiolla, jottei ohjelmaan jää muistivuotoa.
// yhdista_tekstit.h #ifndef _YHDISTA_TEKSTIT_H #define _YHDISTA_TEKSTIT_H 1 extern char *yhdista_tekstit(const char *ensimmainen, ...); #endif
// yhdista_tekstit.c #include "yhdista_tekstit.h" // Otsikot: // stdarg.h: parametrilista (funktion ...-"parametri") #include <stdarg.h> // string.h: tekstin mittaaminen (strlen) ja kopiointi (strcpy) #include <string.h> // stdlib.h: muistin varaus (malloc) #include <stdlib.h> char *yhdista_tekstit(const char *ensimmainen, ...) { va_list lista; size_t len; const char *str; char *yhdiste, *ptr; // Luetaan parametreista tekstien pituudet va_start(lista, ensimmainen); for (str = ensimmainen, len = 0; str != NULL; str = va_arg(lista, const char*)) { len += strlen(str); } va_end(lista); // Varataan sopivasti muistia yhdiste = ptr = malloc(len + 1); if (yhdiste == NULL) { return NULL; // Virhe! } // Kopioidaan kukin teksti (ptr osoittaa aina tekstin loppuun, joten jatketaan aina siitä kohti) va_start(lista, ensimmainen); for (str = ensimmainen; str != NULL; str = va_arg(lista, const char*)) { strcpy(ptr, str); ptr += strlen(ptr); } va_end(lista); // Yhdistetty teksti: return yhdiste; }
// testiohjelma.c // gcc testiohjelma.c yhdista_tekstit.c // Tai lisää IDE:ssä samaan projektiin yhdista_tekstit.c:n kanssa #include <stdio.h> #include <stdlib.h> #include "yhdista_tekstit.h" int main(int argc, char **argv) { char *str; str = yhdista_tekstit("Ohjelma on ", argv[0], ", ja NULL lopettaa.", NULL); printf("Yhdistetty teksti: %s\n", str); free(str); // Muista vapauttaa yhdistetty teksti! return 0; }
Luulenpa, että size_t len;
pitäisi alustaa nollaksi.
Kirjoitusvirhe kommentissa "... ja kopiointi (stdcpy)."
strcpy
sehän siis on.
Kopeekka kirjoitti:
Luulenpa, että
size_t len;
pitäisi alustaa nollaksi.
Kyllä se alustetaan, vaikkakin mielestäni vähän erikoisessa paikassa.
for (str = ensimmainen, len = 0; str != NULL; str = va_arg(lista, const char*)) {
VB.Net ja Visual Basic koodarit saa tällä pään kipeeksi.. vai että monen tekstin yhdistäminen.
Meitzi kirjoitti:
VB.Net ja Visual Basic koodarit saa tällä pään kipeeksi.. vai että monen tekstin yhdistäminen.
Niin saa. ;)
Varsinainen ajatushan tässä on tuo muistin varaaminen dynaamisesti. Yhdistely sinänsä menisi kyllä strcat
-funktiolla, mutta se ei tarkista muistiasioita.