[C] Dynamiczna alokacja pamięci

wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C] Dynamiczna alokacja pamięci

Post 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źć.
Awatar użytkownika
nuclear
Użytkownik
Użytkownik
Posty: 1501
Rejestracja: 22 paź 2006, o 12:01
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 16 razy
Pomógł: 264 razy

[C] Dynamiczna alokacja pamięci

Post 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.
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C] Dynamiczna alokacja pamięci

Post 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
Awatar użytkownika
nuclear
Użytkownik
Użytkownik
Posty: 1501
Rejestracja: 22 paź 2006, o 12:01
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 16 razy
Pomógł: 264 razy

[C] Dynamiczna alokacja pamięci

Post 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++));
}
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C] Dynamiczna alokacja pamięci

Post 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.
Pawelek91
Użytkownik
Użytkownik
Posty: 56
Rejestracja: 23 lis 2008, o 14:54
Płeć: Mężczyzna
Lokalizacja: Wyszogród
Podziękował: 1 raz
Pomógł: 4 razy

[C] Dynamiczna alokacja pamięci

Post 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
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C] Dynamiczna alokacja pamięci

Post 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.
ODPOWIEDZ