🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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'
#904
Author: Pawel Koloszko
Date: Sat, 24 Jan 1998 17:25
25 lines
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'
#905
Author: Titmus
Date: Sat, 24 Jan 1998 19:34
54 lines
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'
#906
Author: Qrczak
Date: Sat, 24 Jan 1998 20:16
23 lines
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'
#907
Author: Michal Malecki
Date: Mon, 26 Jan 1998 13:55
43 lines
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'
#908
Author: Piotr Tauzowski
Date: Mon, 26 Jan 1998 14:53
30 lines
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'
#909
Author: Qrczak
Date: Mon, 26 Jan 1998 16:54
25 lines
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'
#910
Author: Michal Malecki
Date: Tue, 27 Jan 1998 12:20
17 lines
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)
#911
Author: dpilarcz
Date: Wed, 28 Jan 1998 11:49
63 lines
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)
#912
Author: Marek Kotowski
Date: Wed, 28 Jan 1998 16:15
10 lines
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)
#913
Author: Michal Kaczmarczyk
Date: Thu, 29 Jan 1998 02:37
17 lines
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)
#914
Author: Maciej MOCHOL
Date: Thu, 29 Jan 1998 15:20
28 lines
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)
#915
Author: Michal Malecki
Date: Fri, 30 Jan 1998 20:19
18 lines
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