Thread View: pl.comp.lang.c
12 messages
12 total messages
Started by Pawel Koloszko
Sat, 24 Jan 1998 17:25
Problemy z funkcja 'strcat'
Author: Pawel Koloszko
Date: Sat, 24 Jan 1998 17:25
Date: Sat, 24 Jan 1998 17:25
25 lines
1597 bytes
1597 bytes
Tworze wlasnie projekt z C++ i duzo dzialam na lancuchach. Pisze w BorlandC wersja 3.1. Raz po raz korzystam z funkcji 'strcat'(prototyp w zbiorze naglowkowym string.h),jest mi ona wrecz niezbedna, ale zauwazylem ze cos z nia jest nie tak.Wyjasnie na przykladzie: mam trzy lancuchy: char *a="ala",*b="burek",*c="domek"; nastepnie wykonuje nastepujacy ruch: a=strcat(b,a); w tym momencie pod debuggerem widze co nastepuje: a: "burekala"; //ok,tego chcialem b: "burekala"; //a to skad? c: "la" //??????????????? Tak chyba nie powinno to dzialac.Wydaje mi sie, ze blad tkwi w samej funkcji 'strcat', ale nie wiem jak ja ewentualnie naprawic. Moze ktos juz spotkal sie z tym problemem i rozwiazal go. Bardzo bylbym rad z pomocy. Ewentualne e-maile prosilbym na priva, bo rzadko tu bywam; Pozdrowienia ----------------------------------------------------------------------- Pawel Koloszko Email: pablo@ds2.pg.gda.pl Politechnika Gdanska - Telekomunikacja -----------------------------------------------------------------------
Re: Problemy z funkcja 'strcat'
Author: Titmus
Date: Sat, 24 Jan 1998 19:34
Date: Sat, 24 Jan 1998 19:34
54 lines
3010 bytes
3010 bytes
On Sat, 24 Jan 1998 18:25:52 +0100, Pawel Koloszko <pablo@delta.ds2.pg.gda.pl> wrote: >Tworze wlasnie projekt z C++ i duzo dzialam na lancuchach. Pisze w >BorlandC wersja 3.1. Raz po raz korzystam z funkcji 'strcat'(prototyp >w zbiorze naglowkowym string.h),jest mi ona >wrecz niezbedna, ale zauwazylem ze cos z nia jest nie tak.Wyjasnie na >przykladzie: >mam trzy lancuchy: > char *a="ala",*b="burek",*c="domek"; >nastepnie wykonuje nastepujacy ruch: > a=strcat(b,a); >w tym momencie pod debuggerem widze co nastepuje: >a: "burekala"; //ok,tego chcialem >b: "burekala"; //a to skad? >c: "la" //??????????????? >Tak chyba nie powinno to dzialac.Wydaje mi sie, ze blad tkwi w samej >funkcji 'strcat', ale nie wiem jak ja ewentualnie naprawic. Moze ktos juz >spotkal sie z tym problemem i rozwiazal go. Bardzo bylbym rad z pomocy. >Ewentualne e-maile prosilbym na priva, bo rzadko tu bywam; > Niestety błędy (nie błąd) tkwią wyłącznie po twojej stronie. Po pierwsze obszar pamięci wskazywany przez b nie jest w stanie pomieścić sumy łańcuchów "ala" i "burek" - stąd śmieci pojawiające się w *c. Po drugie funkcja strcat(a, b) powoduje dołączenie do łańcucha wskazywanego przez a, łańcucha z b (a musi wskazywać na obszar pamięci, który może pomieścić oba łańcuchy) i zwraca a. Ani a, ani b nie są modyfikowane. Dlatego w towim przypadku a i b wskazywały na ten sam obszar pamięci. (Shift+F1 strcat enter). Twój program powinien wyglądać następująco: char *a="ala",*b="burek",*c="domek"; char *razem=(char*)malloc(strlen(a)+strlen(b)+1); strcat(strcpy(razem,b),a); teraz wszystko powinno być w porządku. Jeszcze jedna uwaga. Obszary pamięci wskazywane przez a, b, c (w przypadku inicjacji stałą napisową) nie powinny być modyfikowane, ponieważ pamięć dla tych łańcuchów jest przydzielana na etapie kompilacji, i na innych systeamch mogą one się znaleźć w pamięci tylko do odczytu. Jeżeli piszesz w C++, to dlaczego nie użyjesz klasy string? Będzie prościej i przyjemniej. -- _/_/_/_/_/ _/ _/_/_/_/_/ _/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ Sebastian Graca _/ _/ _/ _/ _/ Silesian Technical Univeristy _/ _/ _/ _/_/_/ mailto:titmus@zeus.polsl.gliwice.pl One man's fun is another's hell
Re: Problemy z funkcja 'strcat'
Author: Qrczak
Date: Sat, 24 Jan 1998 20:16
Date: Sat, 24 Jan 1998 20:16
23 lines
1590 bytes
1590 bytes
On Sat, 24 Jan 1998, Pawel Koloszko wrote:
> mam trzy lancuchy:
> char *a="ala",*b="burek",*c="domek";
> nastepnie wykonuje nastepujacy ruch:
> a=strcat(b,a);
Przy deklaracjach jak powyżej na łańcuch wskazywany przez b jest
przydzielonych tylko 6 bajtów pamięci (5 na napis i jeden na znacznik
końca), więc dopisanie do niego czegoś zamazuje pamięć następnych
zmiennych.
Jeśli zadeklarujemy łańcuchy tak: char b[20];, to w b będzie miejsce na
19oznakowy napis. Albo tak: char *b = new char[20];.
Oprócz tego zamiast strcat można użyć funkcji strncat, która kopiuje nie
więcej niż n znaków.
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Problemy z funkcja 'strcat'
Author: Michal Malecki
Date: Mon, 26 Jan 1998 13:55
Date: Mon, 26 Jan 1998 13:55
43 lines
2335 bytes
2335 bytes
Pawel Koloszko <pablo@delta.ds2.pg.gda.pl> wrote:
: Tworze wlasnie projekt z C++ i duzo dzialam na lancuchach. Pisze w
: BorlandC wersja 3.1. Raz po raz korzystam z funkcji 'strcat'(prototyp
: w zbiorze naglowkowym string.h),jest mi ona
: wrecz niezbedna, ale zauwazylem ze cos z nia jest nie tak.Wyjasnie na
: przykladzie:
: mam trzy lancuchy:
: char *a="ala",*b="burek",*c="domek";
: nastepnie wykonuje nastepujacy ruch:
: a=strcat(b,a);
Nie bede sie powtarzal po kolegach, jak to powienienes wykonac, zeby bylo
poprawnie. Musze tylko stwierdzic, ze albo cos sobie ubzdurales na temat tej
funkcji, albo korzystales z literatury, ktora dosc niezrozumiale to tlumaczy.
Jej dzialanie NIE polega na laczeniu lancuchow!
Mozna by ta funkcje napisac w ten sposob:
char* strcat( char* gdzie, const char* co )
{
char* koniec = strchr( gdzie, '\0' );
return strcpy( koniec, co );
}
Jak widzisz, funkcja ta nie przydziela na nowo pamieci, powoduje jedynie
zwykle SKOPIOWANIE napisu do lancucha do tablicy. Od strcpy rozni sie tylko
tym, ze kopiuje go na koniec poprzedniego, czyli w miejsce, gdzie znalazl
zero oznaczajace koniec lancucha (koniec lancucha to NIE koniec tablicy!).
I jeszcze jedno, podane rozwiazanie nie jest specjalnie szczesliwe. Pokaze
ci inne:
char wszystko [80];
strcpy( wszystko, "ala" );
strcat( wszystko, " burek" );
Pozdrawiam,
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Re: Problemy z funkcja 'strcat'
Author: Piotr Tauzowski
Date: Mon, 26 Jan 1998 14:53
Date: Mon, 26 Jan 1998 14:53
30 lines
1647 bytes
1647 bytes
Pawel Koloszko <pablo@delta.ds2.pg.gda.pl> napisał(a) w artykule <Pine.GSO.3.96.980124181133.9765A-100000@delta.ds2.pg.gda.pl>... > Tworze wlasnie projekt z C++ i duzo dzialam na lancuchach. Pisze w > BorlandC wersja 3.1. Raz po raz korzystam z funkcji 'strcat'(prototyp > w zbiorze naglowkowym string.h),jest mi ona > wrecz niezbedna, ale zauwazylem ze cos z nia jest nie tak.Wyjasnie na > przykladzie: > mam trzy lancuchy: > char *a="ala",*b="burek",*c="domek"; > nastepnie wykonuje nastepujacy ruch: > a=strcat(b,a); funkcja strcat tylko laczy dwa lancuchy znakow. Miejsce w pamieci musisz zajac sam. musi byc tak: > char *a="ala",*b="burek",*c="domek",*d; > nastepnie wykonuje nastepujacy ruch: d = new char[ strlen(a) + strlen(b) + 1 ] // zajecie miejsca w pamieci na polaczenie lancuchow i wtedy > d=strcat(b,a); A w ogole to najlepiej jest stosowac podejscie obiektowe i utworzyc sobie (albo korzystac z istniejacych) klase "tekst". i wtedy pisze sie o niebo latwiej: tekst a="ala", b="burek", d = a + b;
Re: Problemy z funkcja 'strcat'
Author: Qrczak
Date: Mon, 26 Jan 1998 16:54
Date: Mon, 26 Jan 1998 16:54
25 lines
1462 bytes
1462 bytes
On 26 Jan 1998, Piotr Tauzowski wrote:
> d = new char[ strlen(a) + strlen(b) + 1 ] // zajecie miejsca w pamieci na
> polaczenie lancuchow
> i wtedy
> > d=strcat(b,a);
Oj nie, bo strcat dołącza drugi argument do pierwszego (zwracając go
przy okazji jako argument)! Powyższe jest równoważne:
strcat (b, a); // jakby "b += a"
d = b; // podstawienie samego wskaźnika
Tutaj trzeba raczej np.:
strcpy (d, a);
strcat (d, b);
Zawsze można się obejść bez używania wyniku zwracanego przez strcat.
Czasem może tylko skrócić zapis.
--
QRCZAK
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrczak.home.ml.org/
Re: Problemy z funkcja 'strcat'
Author: Michal Malecki
Date: Tue, 27 Jan 1998 12:20
Date: Tue, 27 Jan 1998 12:20
17 lines
1391 bytes
1391 bytes
Piotr Tauzowski <ptauz@omk.il.pw.edu.pl> wrote:
: funkcja strcat tylko laczy dwa lancuchy znakow. Miejsce w pamieci musisz
: zajac sam.
: musi byc tak:
: d = new char[ strlen(a) + strlen(b) + 1 ] // zajecie miejsca w pamieci na
: polaczenie lancuchow
: i wtedy
:> d=strcat(b,a);
Zeby sie nie powtarzac, odsylam do mojego poprzedniego artykulu.
A tak wogle to najpiew poczytaj troche literature, zanim zaczniesz pisac
takie brednie.
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Re: Problemy z funkcja 'strcat' i Lvalue required (ZGROZA)
Author: dpilarcz
Date: Wed, 28 Jan 1998 11:49
Date: Wed, 28 Jan 1998 11:49
63 lines
2480 bytes
2480 bytes
> funkcja strcat tylko laczy dwa lancuchy znakow. Miejsce w pamieci musisz
> zajac sam.
> musi byc tak:
>
> > char *a="ala",*b="burek",*c="domek",*d;
> > nastepnie wykonuje nastepujacy ruch:
> d = new char[ strlen(a) + strlen(b) + 1 ] // zajecie miejsca w pamieci
na
> polaczenie lancuchow
> i wtedy
> > d=strcat(b,a);
Rany Boskie! Toz to nie ma prawa dzialac (mowie o linijce powyzej). Powinno
byc tak:
strcat(strcpy(d, b), a);
lub (jesli ktos woli pisac rozwlekle)
strcpy(d, b);
strcat(d, a);
A jesli ktos ceni lakonicznosc to moze wszystko zrobic w jednej linijce:
char *d = strcat(strcpy(new char[strlen(a)+strlen(b)+1], b), a);
pod warunkiem, ze new bedzie zglaszalo wyjatek, kiedy nie moze zallokowac
pamieci (nie
pamietam, czy wszystkie kompiatory to umozliwiaja...)
LUDZIE! UWAZAJCIE, CO PISZECIE.
W innym liscie znalazlem
> String "abcd" zajmuje w pamieci 5 (Slownie 5 ZNAKOW!!!). Tak tez string
> "abcd " zajmie ich szesc.
Po 132 krotnym powtorzeniu tego rozumowania dochodzimy do genialnego
odkrycia, ze
string "abcd" zajmuje w pamieci 137 bajtow :->.
Jesli ktos ma watpliwosci wyjasniam
string "abcd" zajmuje w pamieci 5 (slownie PIEC) bajtow. Ni mniej, ni
wiecej.
Tablice mozna wiec inicjalizowac
char tekst[5] = "abcd";
ale standard ANSI C dopuszcza taka inicjalizacje tylko dla zmiennych
globalnych
i statycznych. Niektore kompilatory pozwalaja na inicjalizacje tablic
lokalnych
(automatycznych), ale nie wszystkie.
Przy okazji: lepiej jest pisac
char tekst[] = "abcd";
Wtedy kompilator sam policzy, jaki powinien byc rozmiar tablicy i jest
gwarancja,
ze zrobi to DOBRZE. Nie pomyli mu sie piatka z szostka
Pozdrawiam, Darek
email:
--
dpilarcz@elbacsb.com.pl
Re: Problemy z funkcja 'strcat' i Lvalue required (ZGROZA)
Author: Marek Kotowski
Date: Wed, 28 Jan 1998 16:15
Date: Wed, 28 Jan 1998 16:15
10 lines
926 bytes
926 bytes
dpilarcz wrote: > Tablice mozna wiec inicjalizowac > char tekst[5] = "abcd"; > ale standard ANSI C dopuszcza taka inicjalizacje tylko dla zmiennych > globalnych > i statycznych. Nieprawda. Marek Kotowski
Re: Problemy z funkcja 'strcat' i Lvalue required (ZGROZA)
Author: Michal Kaczmarczyk
Date: Thu, 29 Jan 1998 02:37
Date: Thu, 29 Jan 1998 02:37
17 lines
1349 bytes
1349 bytes
On 28 Jan 1998, dpilarcz wrote:
> W innym liscie znalazlem
>
> > String "abcd" zajmuje w pamieci 5 (Slownie 5 ZNAKOW!!!). Tak tez string
> > "abcd " zajmie ich szesc.
^
Tu jest spacja ;-)
> Po 132 krotnym powtorzeniu tego rozumowania dochodzimy do genialnego
> odkrycia, ze
> string "abcd" zajmuje w pamieci 137 bajtow :->.
[...itd. ciach!]
_______________________________________________________________________________
Michał Kaczmarczyk mailto:mik@iname.com http://student.uci.agh.edu.pl/~kaczmar
Re: Problemy z funkcja 'strcat' i Lvalue required (ZGROZA)
Author: Maciej MOCHOL
Date: Thu, 29 Jan 1998 15:20
Date: Thu, 29 Jan 1998 15:20
28 lines
1462 bytes
1462 bytes
On 28 Jan 1998, dpilarcz wrote: > > String "abcd" zajmuje w pamieci 5 (Slownie 5 ZNAKOW!!!). Tak tez string > > "abcd " zajmie ich szesc. > > Po 132 krotnym powtorzeniu tego rozumowania dochodzimy do genialnego > odkrycia, ze > string "abcd" zajmuje w pamieci 137 bajtow :->. "abcd" to chyba nie to samo co "abcd " ... > > Pozdrawiam, Darek > email: > -- > dpilarcz@elbacsb.com.pl > > pozdrawiam c. -------------------------------------. Codematic | code@beta.cku.pwr.wroc.pl | mmochol@elka.pw.edu.pl | http://home.elka.pw.edu.pl/~mmochol | -------------------------------------'
Re: Problemy z funkcja 'strcat' i Lvalue required (ZGROZA)
Author: Michal Malecki
Date: Fri, 30 Jan 1998 20:19
Date: Fri, 30 Jan 1998 20:19
18 lines
1415 bytes
1415 bytes
dpilarcz <dpilarcz@elbacsb.com.pl> wrote:
:> String "abcd" zajmuje w pamieci 5 (Slownie 5 ZNAKOW!!!). Tak tez string
:> "abcd " zajmie ich szesc.
: Po 132 krotnym powtorzeniu tego rozumowania dochodzimy do genialnego
: odkrycia, ze
: string "abcd" zajmuje w pamieci 137 bajtow :->.
No coz, a po 128*1024*1024 razie zabraknie pamieci.
Gratuluje spostrzegawczosci.
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads