Sida 1 av 1

Hjälp Förstå c-funktion [LÖST]

Postat: 14 jul 2008, 21:16
av Rasmus
Jag skulle behöva lite hjälp med att förstå följande c-funkton, hjälp mig med att fylla i komentarerna.

Kod: Markera allt

char *getconfig(const char* location, const char searchstr[]) {
        FILE *file;
        char *w[100], string[100];
        int x[100], i=0;
        file = fopen (location, "r");
        if (file == NULL) return NULL;
        else {
                while(fgets(string , 100 , file) != NULL) { //???
                        x[i] = strlen(string)-1; //???
                        if(string[0] == '/') continue; // om första tecknet på raden är "/" ???
                        w[i] = strchr(string,'(')-1; //???
                        *w[i] = 0; //w# = 0
                        if(!strcmp(searchstr, string)) { // om searchstr = string
                                char *crlf = strpbrk(w[i]+3, "\r\n"); //???
                                if(crlf) //om crlf = 1
                                        *crlf = 0; // crlf = 0
                                return w[i]+3; //Gåtillbaka med w#+3
                        }
                        i++;
                }
                fclose(file);
                return NULL;
        }
}

Re: Hjälp Förstå c-funktion

Postat: 14 jul 2008, 22:13
av mcNisse
Jag gör ett försök. Min C är lite ringrostig ;)
Rasmus skrev:while(fgets(string , 100 , file) != NULL) { //???
Läser in max 99 tecken i string från file. Kontrollerar om slutet på filen har nåtts. fgets returnerar NULL i det läget.
Rasmus skrev:x = strlen(string)-1; //???

Tilldelar tilldelar sista index i string till x.
Rasmus skrev:  if(string[0] == '/') continue; // om första tecknet på raden är "/"???

läs in nästa sträng.
Rasmus skrev:w = strchr(string,'(')-1; //???

Letar reda på index för sista förekomsten av ( i string.
Rasmus skrev: char *crlf = strpbrk(w+3, "\r\n"); //???

Hittar en windows radbrytning tre tecken bakom sista (.

Re: Hjälp Förstå c-funktion

Postat: 14 jul 2008, 22:30
av Rasmus
Tack, du hjälpte mig massor. Nu borde jag kunna göra en funktion som kollar en config-fil O0

Edit:
Funktionen kändes fortfarande lite för svår så jag modifierade den:

Kod: Markera allt

char *getcolour(const char* location, int t) {
        FILE *file;
        char string[50];
        int n=0;
        file = fopen (location, "r");
        if (file == NULL) return NULL;
        else {
                while(fgets(string , 50 , file) != NULL) {
                        if(string[0] == '/') continue;
                        if(string[0] == '0') {
                        	if(string[1] == 'x') {
					n++;
					if( n == t) {
		                	        return string;		
					}
				}
                        }
                }
                fclose(file);
                return NULL;
        }
}
koden returnerade 0xff0000ff + en not, hur får jag den att bara returnera 0xff0000ff?

Re: Hjälp Förstå c-funktion

Postat: 16 jul 2008, 20:35
av gasol
När du returnerar string variabeln så returnera du en variabel som är allokerad på stacken istället för heapen, detta gör att när du kör ditt programm så kan minnesområdet som string variabeln är lagrad på vara överskrivet när funktionen har returnerat. Du borde köra såhär istället (se koden) (Glöm inte att köra free på strängen när du är klar med den)

Om du ger gcc flaggan -Wall så borde du få en varning i stil med: fil.c:xxx warning: function returns address of local variable Sedan så bör du även stänga filen med fclose då du returnerar string variablen.

Kod: Markera allt

char *getcolour(const char* location, int t) {
        FILE *file;
        char *string;
        int n=0;

       string = malloc(sizeof(char) * 50);

        file = fopen (location, "r");
        if (file == NULL) return NULL;
        else {
                while(fgets(string , 50 , file) != NULL) {
                        if(string[0] == '/') continue;
                        if(string[0] == '0') {
                        	if(string[1] == 'x') {
					n++;
					if( n == t) {
                                                fclose(file);
		                	        return string;		
					}
				}
                        }
                }
                fclose(file);
                free(string);
                return NULL;
        }
}
OBS jag har inte kompilerat denna kod så jag vet inte om den fungerar...