Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 18 odgovora
  • 5.241 pregleda

Najnovija ↓

problem sa karakterima 03.10.2006. u 11:03 · pre 244 meseca #1
Ako imam:
char * c1;
char * c2;
char * c3;
Kako da dobijem c3 tako da bude spoj c1 i c2? Znam kako se to radi kod obicnih stringova (append) ali meni treba u ovom obliku.
Re: problem sa karakterima 03.10.2006. u 15:20 · pre 244 meseca #2
1) ako hoces da nadovezes c2 na c1 uradis ovako
strcat(c1,c2);

2) ako ti treba u posebnom stringu c3, onda prvo prekopiras
strcpy(c3,c1);
pa onda nadovezes
strcat(c3,c2)

Znaci sad je c3=c1+c2...
Potpis
Mislim, šta reći !
Re: problem sa karakterima 08.10.2006. u 20:27 · pre 244 meseca #4
JBT, NE RADI!!! Si ti probao ovo da iskompajliras? Meni javlja gresku!!!
Re: problem sa karakterima 09.10.2006. u 16:50 · pre 244 meseca #6
Code:

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

char * c1;
char * c2;

int main()
{
    c1="prvi";
    c2="drugi";
    strcat(c1,c2);

    cout<<c1<<endl;

    return 0;
}


Kad stigne do strcat program se prekida, javlja se greska i nista...Don't send...
Re: problem sa karakterima 09.10.2006. u 17:13 · pre 244 meseca #7
Nemozes ovako deklarisati:
char * c1;
char * c2;

Mora kompajler znati kolike su duzine, ili ovako kao sto sam ja u kodu,
ili da navedes neki maksimum pa kasnije da uneses, recimo char c1[23].

Probaj ovako klosarski, kod mene radi :) .
Kod mene bez tog exit odradi ali prijavi gresku, iz ne znam kog razloga.

Code:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

int main()
{
    char c1[]="prvi";
    char c2[]="drugi";
    strcat(c1,c2);

    cout<<c1<<endl;

    exit(1);

    return 0;
}
Potpis
Mislim, šta reći !
Re: problem sa karakterima 09.10.2006. u 19:56 · pre 244 meseca #8
Sada je cool...samo mi nista ne vredi zbog onog "exit"...
Re: problem sa karakterima 09.10.2006. u 20:05 · pre 244 meseca #9
Kako ne vredi, normalno napravi program samo na kraju stavi taj exit.
Zaista ne znam zasto to radi, probao sam bez std-a, sa printf, i sa puts,
svasta sam pokusavao, ali samo ovako radi.
Potpis
Mislim, šta reći !
Re: problem sa karakterima 09.10.2006. u 20:24 · pre 244 meseca #10
To dovodi do segfault-a iliti na Winu do access violation-a. Razlog je što prvi string treba da ima dovoljno alociranog prostora da primi novi "spojen" string.

Uglavnom, najozbiljnije savetujem da koristite ovako nešto:

Code:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string c1 = "prvi";
    string c2 = "drugi";
    c1.append(c2);

    cout<<c1<<endl;

    return 0;
}


Potpis
IOCC
Re: problem sa karakterima 09.10.2006. u 22:07 · pre 244 meseca #11
Citat:

Znam kako se to radi kod obicnih stringova (append) ali meni treba u ovom obliku.
Potpis
Mislim, šta reći !
Re: problem sa karakterima 10.10.2006. u 01:43 · pre 244 meseca #12
E, onda mora nešto ovako (iz glave):

Code:

char* c1 = "prvi";
char* c2 = "drugi";

char* c3 = new char[strlen(c1) + strlen(c2) +1];
strcpy(c3, c1);
strcat(c3, c2);

cout << c3;

delete[] c3;


mada je potpuno besmisleno pisati takav kod.
Potpis
IOCC
Re: problem sa karakterima 10.10.2006. u 02:03 · pre 244 meseca #13
Citat:
kish:
Code:

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

char * c1;
char * c2;

int main()
{
c1="prvi";
c2="drugi";
strcat(c1,c2);

cout<<c1<<endl;

return 0;
}


Kad stigne do strcat program se prekida, javlja se greska i nista...Don't send...

Linija
Code:
c1="prvi";
rezervise 5 bajta memorije (1 znak je jedan bajt dakle 4 bajta, plus jos jedan bajt za 0, sto zahtevaju mnoge funkcije za rad sa nizovima karaktera - stringovima),

Code:
c2="drugi";
rezervise 6 bajta memorije,

Code:
strcat(c1,c2);
funkcija strcat() fokusava da ceo niz c2 od 5 bajta (0 ce se samo dodati umesto vec postojeceg u c1 na kraju tako da se ne racuna) smesti iza slova 'i' u c1.

Znaci potrebno je da c1 ima rezervisano 10 bajta memorije (4 za rec "prvi", 5 za rec "drugi" i 1 za 0 terminirajuci znak), ali c1 je rezervisao samo 5 bajta memorije, sto znaci da ce funkcija da pokusa da pise "iza" memorije koja je rezervisana za c1, tj. u eventualno tudjoj memoriji, sto ce izazvati gresku/izuzetak - Segmentation fault.

Iz objasnjenja za funkciju strcat() izmedju ostalog pise:
Citat:
The strings may not overlap, and the dest string must have enough space for the result.


Ako hoces da ovo uradis u tzv. C++ maniru onda koristi klasu std::string u suprotnom (ako ti treba u tom obliku) moras da obezbedis dovoljno memorije u _odredisnom_ nizu. Npr.
Code:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

char * c1;
char * c2;

int main()
{
   c1="prvi";
   c2="drugi";
   char buf[strlen(c1)+strlen(c2)+1];

   strncpy(buf, c1, strlen(c1)+1); // broju koji vrati "strlen()" dodaj jos 1 da bi kopirao i 0 iz "c1"
   strcat(buf,c2);

   cout<<buf<<endl;
}
Re: problem sa karakterima 10.10.2006. u 02:07 · pre 244 meseca #14
Dok sam pisao poruku, ne videh. Na dobar deo pitanja je vec odgovoreno.
Re: problem sa karakterima 10.10.2006. u 11:13 · pre 244 meseca
izmenjeno 1 put, poslednji put android~paranoid 10.10.2006. u 11:34
  1. android~paranoid10.10.2006. u 11:34zapis iz teksta poruke
#15
Sad mi je jasno zasto, ali...
kad sam isprobavao, naisao sam na slucaj da ako drugi string ima isto ili manje
znakova od prvog, onda uradi normalno bez greske, sto je cudno.

Code:

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

int main()
{
    char c1[]={'p','r','v','i','\0'};
    char c2[]={'d','r','u','\0'};

    strcat(c1,c2);

    printf("%s",c1);
    
    return 0;
}
Potpis
Mislim, šta reći !
Re: problem sa karakterima 10.10.2006. u 11:33 · pre 244 meseca #16
Citat:
Milan Aksic: 
char buf[strlen(c1)+strlen(c2)+1];



Mora da se navede broj (konstanta) kaze kompajler, znaci mora dinamicki da se dodeli memorija, kao sto je Dragi Tata uradio.
Potpis
Mislim, šta reći !
Re: problem sa karakterima 10.10.2006. u 13:51 · pre 244 meseca #17
Citat:
android~paranoid: Mora da se navede broj (konstanta) kaze kompajler, znaci mora dinamicki da se dodeli memorija, kao sto je Dragi Tata uradio.


Mislim da Milan koristi gcc koji ima ovu C99 ekstenziju, ali si u pravu. C++ ne dozvoljava takve konstrukcije.
Potpis
IOCC
Re: problem sa karakterima 10.10.2006. u 23:11 · pre 244 meseca #18
Citat:
android~paranoid: Mora da se navede broj (konstanta) kaze kompajler, znaci mora dinamicki da se dodeli memorija, kao sto je Dragi Tata uradio.
Da, moj previd, izvinjavam se.
Neka me Nemanja ispravi ili dopuni ali kako je niz samo konsantni pokazivac, broj za rezervisanje memorije mora biti konstantan, tj. poznat za vreme prevodjenja a ne tokom izvrsavanja programa (strlen() funkcija se poziva tokom izvrsavanja).
Citat:
Dragi Tata: Mislim da Milan koristi gcc koji ima ovu C99 ekstenziju, ali si u pravu. C++ ne dozvoljava takve konstrukcije.
Eh, nisam ni prevodio onaj gore program, vec sam ga napisao dok sam odgovarao, bez proveravanja :)
Ipak, gcc prijavljuje gresku tek sa -pedantic opcijom:
milaks:~/test
$ g++ -o bla bla.cpp -pedantic
bla.cpp: In function ‘int main()’:
bla.cpp:14: error: ISO C++ forbids variable-size array ‘buf’
Re: problem sa karakterima 11.10.2006. u 00:09 · pre 244 meseca #19
Citat:
Milan Aksic: Neka me Nemanja ispravi ili dopuni ali kako je niz samo konsantni pokazivac, broj za rezervisanje memorije mora biti konstantan, tj. poznat za vreme prevodjenja a ne tokom izvrsavanja programa (strlen() funkcija se poziva tokom izvrsavanja).


Tacno tako, jos bih dodao da se pri prenosu matrice u f-ju mora znati broj kolona (nemora br. redova) uravo da bi kompajler znao koliko memorije da rezervise.
Potpis
Mislim, šta reći !
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme