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

Här diskuteras programmering och utveckling
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

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

Inlägg 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;
        }
}
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg 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 (.
Användarvisningsbild
Rasmus
Inlägg: 2291
Blev medlem: 07 sep 2006, 18:33
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Svalsta

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

Inlägg 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?
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

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

Inlägg 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...
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Skriv svar

Återgå till "Programmering och webbdesign"