Fråga angående malloc?

Här diskuteras programmering och utveckling
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Fråga angående malloc?

Inlägg av ZerQ »

Jag sitter och experimenterar och har skrivit ihop denna lilla kod för att läsa in tecken för tecken ifrån en fil till strängar, jag skapar sedan en ny sträng som bara skall innehålla de antaltecken som är inläst, kruxet är att om jag kollar hur många tecken jag får så blir dom för många, sS2 innehåller 32 tecken istället för som det borde vara 19+1.

Varför, vart har jag gjort fel?

Kod: Markera allt

while ((cTecken = fgetc(stream)) != EOF)
	{
		if(cTecken != '\n')
		{
			sS1[i++] = cTecken;
			
		}
		else
		{
                        i += 1;
			sS1[i] = '\n';
			sS2 = malloc((i) *sizeof(char));
			strncpy(sS2, sS1, i);
			clrMem(sS1, sS2, &i);			
			sS1 = malloc(200 *sizeof(char));
			
			
		}
	}
Säljer massa saker kolla in min hemsida http://www.befta.com
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

SV: Fråga angående malloc?

Inlägg av Lars »

strlen() beräknar strängens längd genom att leta efter första NULL-tecknet, så du måste avsluta strängen med sS1 = '\0';.

Nu vet jag ju inte riktigt vad du gör i clrMem, men du måste köra free() på sS1 innan du kör malloc() igen, eller så kan du använda realloc().
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

SV: Fråga angående malloc?

Inlägg av ZerQ »

Funktionen clrMem rensar med "free" sS1 och sS2 och sätter pekarna till NULL, samt nollar variabeln i, gjorde denna funktion bara för att slippa så många rader kod under else-satsen.

Men jag skall prova att använda '\0' istället för '\n' som jag har nu då och se vad som händer.
Säljer massa saker kolla in min hemsida http://www.befta.com
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Fråga angående malloc?

Inlägg av gasol »

sS1 = malloc(200 *sizeof(char)); om du alltid ska ha 200 tecken i denna sträng så kan du lika gärna göra det statiskt.

char sS1[200];


Koden borde se ut nåt i stil med det här

Kod: Markera allt

     while ((cTecken = fgetc(stream)) != EOF && i < 199)  <--- ha ALLTID en gräns på hur många tecken du läser om du inte har en oändligt stor buffer att läsa in i

Kod: Markera allt

                        i += 1;
			sS1[i] = '\n';
                        sS1[i + 1] = '\0'; <--- NULL terminera alltid dina strängar!
			sS2 = malloc((i) *sizeof(char));
			strncpy(sS2, sS1, i);

Ett tips är att använda calloc(size_t nmemb, size_t size); det skulle isåfall vara
sS2 =  calloc(sizeof(char),  200); // calloc kommer att sätta alla element i sS2 till '\0' också åt dig!
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"