Strona 1 z 1

[C] Dynamiczna alokacja pamięci

: 15 gru 2010, o 10:53
autor: wawek91
Witam mam napisac program ktory będzie usuwał ostatni element stringa a następnie wypisywał za każdym razem reszte stringa. (mam nadzieje że wiadomo ocb) Oto moj kod:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

#define N 128

void deleteLastChar(char** s)
{
    char *wsk;
    int i, j, rozmiar = 0;
    
    for(i = 0; (*s)[i] != '\0'; i++)
        rozmiar++;
        
    wsk = (char*)malloc(rozmiar);
    
    for(j = 0; j < rozmiar-1; j++)
        wsk[j] = (*s)[j];
        
    wsk[rozmiar-1] = '\0';
    
    free(*s);
    
    *s = wsk;
    
    puts(*s);
}

int main(int argc, char *argv[])
{
    int i, rozmiar = 0;
    char tab[N];
    char *napis;
    
    fgets(tab, sizeof(tab), stdin);
    
    for(i = 0; tab[i] != '\0'; i++)
        rozmiar++;
    
    napis = (char*)malloc(rozmiar);
    
    for(i = 0; tab[i] != '\0'; i++)
        napis[i] = tab[i];
        
    for(i = 0; *napis != '\0'; i++)
        deleteLastChar(&napis);
    
    system("PAUSE");	
    return 0;
}

Problem tkwi w tym że kiedy się poda troche dłuższy string (czyt. np kilkanaście znaków) to aprocz tego stringu program wyświetla jeszcze jakies krzaki które to one najpierw są usuwane. Gdzie leży błąd? Sam nie moge go znaleźć.

[C] Dynamiczna alokacja pamięci

: 15 gru 2010, o 11:55
autor: nuclear
ja bym w sumie ro inaczej napisał.
w funkcji usuwającej zamieniałbym przedostatni element ciągu na '\0' oraz przy pomocy realloc zmniejszał jego rozmiar.

[C] Dynamiczna alokacja pamięci

: 15 gru 2010, o 12:00
autor: wawek91
A zapomniałem, mam napisać to bez funkcji realloc ;p-- 16 gru 2010, o 09:09 --podbijam temat... bardzo prosze o pomoc ponieważ na dziś muszę to mieć a dalej nie widze tutaj błędu, z gory dziękuje

[C] Dynamiczna alokacja pamięci

: 16 gru 2010, o 14:34
autor: nuclear
a moze byc z calloc?

Kod: Zaznacz cały

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void obetnij(char *tab);

int main(void){
    char tab[]="dupa zbita";
    int i=0;
    int rozmiar=strlen(tab);
    for(i=0;i<rozmiar;i++){
	obetnij(tab);
        printf("%s\n",tab);
        
    }
}

void obetnij(char *tab){
    char *tab2;
    tab2=(char*)malloc(strlen(tab)-1);
    tab[strlen(tab)-1]='\0';
    while(*(tab2++)=*(tab++));
    tab=calloc(strlen(tab2),sizeof(char));
     while(*(tab++)=*(tab2++));
}

[C] Dynamiczna alokacja pamięci

: 16 gru 2010, o 19:05
autor: wawek91
Kurde byłoby ok tylko że u mnie deklaracja funkcji musi wygladać tak jak napisalem. W sumie moj bład bo nie podałem dokładnego tematu ktory brzmi:

Napisz funkcję
void deleteLastChar(char** s)
która usuwa z końca napisu s ostatni znak i zmienia odpowiednio rozmiar tablicy zawierającej napis. Po każdym usunięciu kolejnego znaku program ma wypisać napis.


UWAGA:

Przy testowaniu funkcji w programie glownym przekazywany do funkcji deleteChar napis musi byc alokowany dynamicznie. W przeciwnym razie funkcja deleteChar bedzie probowala zwolnic pamiec przydzielana statycznie.

[C] Dynamiczna alokacja pamięci

: 16 gru 2010, o 20:06
autor: Pawelek91
znaczki powstają, bo w 43l powinieneś jeszcze dodać znak konca, bo takto leci poza string, a ze pamiec nie wyczyszczona, to sa i kwiatki:

Kod: Zaznacz cały

napis[i+1]='\0';
ciekawsze jest to, ze dla nieparzystej dlugosci stringow daje jedna pusta linijke

[C] Dynamiczna alokacja pamięci

: 17 gru 2010, o 08:37
autor: wawek91
Boże jesteś cudowny :p dzięki wielkie sam bym chyba się nie doszukał bo myślałem, że błąd tkwi w funkcji.