Navigationskarta Insitutitionen för Datavetenskap Umeå Universitet

Kodexempel F15

Större delen av föreläsningen handlade om filsystem, särskilt EFS. Det finns en PostScript-fil med en sammanfattning. Vidare finns alla OH-bilder om filsystemet i EPS-format:


char *vstrcat(char *first, ...) /* stdlib, stdarg, string needed */
{                               /* See C FAQ for more info */
    size_t len;
    char *retbuf, *p;
    va_list argp;

    if (first == NULL) return NULL;
    len = strlen(first);
    va_start(argp, first);
    while((p = va_arg(argp, char *)) != NULL)
        len += strlen(p);
    va_end(argp);

    retbuf = malloc(len+1); /* Check return value in real code! */
    strcpy(retbuf, first);

    va_start(argp, first);
    while((p = va_arg(argp, char *)) != NULL)
        strcat(retbuf, p);
    va_end(argp);

    return retbuf; /* Caller must call free() later */
}

Ovanstående kodsnutt visar hur man skriver funktioner som använder sig av ett variabelt antal argument. Ett exempel på en sådan funktion är printf(). Funktionen ovan motsvarar strcat(), men slår ihop flera strängar och allokerar själv minne för den sammanslagna strängen:

newstr = vstrcat("Ett ", "litet ", "exempel!", (char *) NULL);

Funktionen måste på något vis veta hur många argument den har fått. Man kan använda ett särskilt värde för att ange att listan är slut (NULL i ovanstående funktion). Ett annat sätt är att först skicka ett heltal som anger antalet argument. Här använder printf() en speciell metod: antalet argument är lika med antalet konverteringsspecifierare (%d, %s osv) som ingår i formatsträngen.

[an error occurred while processing this directive]