[ nemi @ 09.06.2006. 19:46 ] @
Pozdrav !
evo mog problema pa ako možete pomoći bilo bi supeeeeeeer

Napiši funkcijski podprogram koji spaja dva stringa , char*concat ( char*dest , char*src),
dest pokazuje na početak prvog a src na početak drugog stringa.Drugi treba naljepiti na kraj prvoga a funkcija vraća pokazivač na početak stringa dobivenog spajanjem dva stringa .
Napiši i glavni program!

evo to je zadatak tnxxxxxxxxxx na bilo kakvoj pomoći!
[ slavkot @ 09.06.2006. 20:17 ] @
Ako sam dobro skont'o, to ti je jednostavno:

Code:

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


  char*concat ( char*dest , char*src)
  {
    return strcat(dest, src);    //f-ja za povezivanje znakovnih nizova
    }


int main(int argc, char *argv[])
{
  char a[50], b[50];
  printf("Unesi prvi string: ");
  gets(a);
  printf("Unesi drugi string: ");
  gets(b);
  printf(concat(a,b));
  system("PAUSE");    
  return 0;
}
[ nemi @ 09.06.2006. 20:25 ] @
hvalaaaaaaaaaaaaaaaaaaaaaaaaaaa
[ nemi @ 09.06.2006. 20:39 ] @
hvala na brzini!
pa da ne postavljam novu temu ako Vam nije problem pogledat još ovaj zadatak bila bi mi velika pomoć

Napiši funkcijski podprogram koji iščitava tekstualnu datoteku "ulaz.txt" znak po znak i prepisuje je u tekstualnu datoteku "izlaz.txt" pri tome zamjenjujući mala slova velikim i obratno.
dano je
void mala_velika (FILE*in, FILE*out);
napisati i glavni program
a ovo bi moglo pomoći
FILE*fopen(const char*filename, const char*mode);
int fgetc(FILE*stream)
int fputc(int character, FILE*stream);

unaprijed zahvalnaaaaa!
[ n1tr0 @ 10.06.2006. 00:30 ] @
Citat:
nemi:
Napiši funkcijski podprogram koji spaja dva stringa , char*concat ( char*dest , char*src)
Citat:
slavkot: Ako sam dobro skont'o, to ti je jednostavno:
...
Code:

  char*concat ( char*dest , char*src)
  {
    return strcat(dest, src);    //f-ja za povezivanje znakovnih nizova
    }

...

Mislim da nisi dobro shvatio, jer nema svrhe pisati f-ju za vec gotovu f-ju. Ovako bi na steku zauzeo bez razloga jos 3x32bita(povratna adresa,adresa parametra1,adresa parametra2). Cilj je pretpostavljam napraviti svoju f-ju ekvivalentnu f-ji strcat, a ona bi izgledala otprilike ovako:
Code:

char *concat ( char*dest , char*src)
{
    while(*dest!='\0') dest++;  // znak '\0' oznacava kraj stringa
                                         // kada dodje do '\0' uci ce u do petlju i zameniti ga sa prvim znakom iz 2. stringa
                                         // a zatim u poslednjem prolasku kroz do petlju stavice '\0' na kraj stringa
    do{
        *dest=*src;
        dest++;
        src++;
    }
    while(*src!='\0');
    return dest;
}

Napomene: - f-ju nisam isprobao-mozda ima gresaka
- treba paziti da prostor koji zauzmete za 1. string bude dovoljan da se smesti prvi i drugi string
[ Odin D. @ 10.06.2006. 10:54 ] @
U pravu si sto se tice rjesenja zadatka: sigurno nije trebalo napraviti funkciju za spajanje stringova pomocu gotove funkcije koja spaja stringove, vec napraviti svoju verziju.
U tvom rjesenju ima par propusta, gledajuci ovako odoka:
Prvo, nemas nikakve provere na duzinu stringova. Ako se funkciji prosledi neki pokazivac na neki neispravan string, koji na svom kraju nema '/0' (znam da treba backslash umesto /, nego pisem sa nekog racunara na kom je instaliran RedHat sa nemackom tastaturom pa me mrzi da ga trazim) prepisivanje ce da se nastavi unedogled dok se ne naleti negde na taj znak u memoriji ili dok mu OS ne lupi samar.
Drugo, funkcija ti ne vraca ispravnu vrednost pokazivaca. Umesto da vrati pokazivac na pocetak stringa dest, ona ga vraca na kraj, tamo dokle si dogurao sa kopiranjem karaktera. Na pocetku funkcije treba da se sacuva vrednost pokazivaca dest, pa da se ta sacuvana vrednost vrati, a ne ona koja je inkrementirana u funkciji.
[ n1tr0 @ 10.06.2006. 23:06 ] @
Citat:
Odin D.:
Prvo, nemas nikakve provere na duzinu stringova. Ako se funkciji prosledi neki pokazivac na neki neispravan string, koji na svom kraju nema '/0' (znam da treba backslash umesto /, nego pisem sa nekog racunara na kom je instaliran RedHat sa nemackom tastaturom pa me mrzi da ga trazim) prepisivanje ce da se nastavi unedogled dok se ne naleti negde na taj znak u memoriji ili dok mu OS ne lupi samar.

U pravu si, ali to je bas ono sto hocu da f-ja radi. Cilj je da f-ja radi sto brze, i sto manje memorije da koristi... Moze se napraviti i tako, ali moja f-ja predvidja da programer pre poziva f-je obradi stringove, i da joj prosledi ispravne. Uglavnom su stringovi ispravni, ali programer mora znati da prepozna kada string moze da bude neispravan i ispravi ga dodavanjem '\0' na kraj. Kada bi f-ja gledala duzinu stringa koristio bi bar jos dve mem. lokaciju za smestanje duzina stringova i jos bi trebao pozivati f-ju za odredjivanje duzine(npr. strlen), a posto je string u 90% slucajeva ispravan to bi drasticno usporilo izvrsavanje programa.

Citat:
Odin D.:
Drugo, funkcija ti ne vraca ispravnu vrednost pokazivaca. Umesto da vrati pokazivac na pocetak stringa dest, ona ga vraca na kraj, tamo dokle si dogurao sa kopiranjem karaktera. Na pocetku funkcije treba da se sacuva vrednost pokazivaca dest, pa da se ta sacuvana vrednost vrati, a ne ona koja je inkrementirana u funkciji.

U pravu si... Zaleteo sam se pa me mrzelo compile-ovati i proveriti. Evo ispravljene f-je:
Code:

char *concat (char *dest , char *src)
{
    char *str;
    str=dest;
    while(*dest!='\0') dest++;  // znak '\0' oznacava kraj stringa
                                         // kada dodje do '\0' uci ce u do petlju i zameniti ga sa prvim znakom iz 2. stringa
                                         // a zatim u poslednjem prolasku kroz do petlju stavice '\0' na kraj stringa
    do{
        *dest=*src;
        dest++;
        src++;
    }
    while(*src!='\0');
    return str;
}
[ yooyo @ 11.06.2006. 02:46 ] @
Code:

char* concat (char *dest, char *src)
{
    char *t = dest;
    while (*dest) dest++;
    while (*dest++ = *src++);
    return t;
}


...podrazumeva se da su dest i src terminisani sa '\0'

[ X Files @ 11.06.2006. 08:16 ] @
Ako profesor [hoce da ispadne pametan i] trazi implementaciju vec gotovih resenja,
dovoljno je saznati kako se zove originalna funkcija, a zatim [se i vi napravite pametni i]
pozovite 'prijatelja' (Google):

strcat implementation

Eto, cak i Wikipedia (kao prvi odgovor) daje nekoliko resenja:
http://en.wikipedia.org/wiki/Strcat

P.S.

Inace, ima smisla prethodno pogledati kako su takve funkcije implementirane u
originalu. U praksi, probleme mogu stvoriti gluposti tipa NEPROVERAVANJA pocetih
uslova (naravno, u zavisnosti sta se trazi):

if ( str1 != str2 )
{
// ...
}

ili

if ( str1 && str2 )
{
// ...
}
[ nemi @ 11.06.2006. 15:23 ] @
Bok! takve tekstualne zadatke dobijemo napisane na papirima i rješavamo ih na papiru ,tako da nemamo pristup pc -u i pri rješavanju zadatka koristiš ono što ti je zadano uz napomenu :"ne koristite scanf i printf"! mraaak