Výsledky 1 až 14 z 14

Téma: [C] Prace s retezci, kde je tam do boha chyba?

  1. #1
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    358

    Standardní [C] Prace s retezci, kde je tam do boha chyba?

    Muzete nekdo kouknout na nasledujici kod? Ma to najit v retezci vstup podretezec s1 a nahradit ho podretezcem s2... Uz fakt nevim, co je tam blbe...

    Kód:
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    
    char *NajdiNahrad&#40;char *vstup, char *s1, char *s2&#41;
    &#123;
        char *ptr, *pracovni, *usek;
        ptr=strstr&#40;vstup, s1&#41;; /* ptr - ukazatel na misto vyskytu podretezce s1 */
        strcpy&#40;pracovni,""&#41;;
        if &#40;ptr!=0&#41; /* s1 byl ve vstupu nalezen */
        &#123;
            strncat&#40;pracovni, vstup, strlen&#40;vstup&#41;-strlen&#40;ptr&#41;&#41;; /*Zkopiruji prvni cast az do zacatku s1 */
            usek=ptr+strlen&#40;s1&#41;; /* tohle je cast ZA retezcem s1 - s1 a s2 nemusi byt stejne dlouhe */
            strncat&#40;pracovni, s2, strlen&#40;s2&#41;&#41;; /* pripojime s2 */
            strncat&#40;pracovni, usek, strlen&#40;usek&#41;&#41;; /* a nakonec posledni kousek */
            return&#40;pracovni&#41;; 
        &#125;    
        else
        &#123;
            return&#40;vstup&#41;; /*kdyz se s1 nenajde, vratime puvodni retezec */
        &#125;    
    &#125;
    
    int main&#40;void&#41;
    &#123;
        char *vstup, *s1, *s2, *vysledek;
        strcpy&#40;vstup,"Usama Bin Ladin"&#41;;
        strcpy&#40;s1,"Bin"&#41;;
        strcpy&#40;s2,"Bush"&#41;;
        vysledek=NajdiNahrad&#40;vstup, s1, s2&#41;;
        printf&#40;"%s\n", vysledek&#41;;
        return&#40;0&#41;;
    &#125;
    V DevCpp zpusobi v XP hlasku "V programu ... nastala chyba a bude nutno jej uzavrit"... atd..??
    Jelikoz ted nejsem doma, kde mi to pod starym Borland C a W2k jelo celkem solidne, tak mam podezreni na kompilator/OS... Mohl by se najit nejaky dobrodinec a zkusit to nekde u sebe zkompilovat a pustit? Uz fakt nevim, co je tam blbe... Mozna jsem se nekde uklepl, protoze nebudu nic zastirat, praci s retezci v C moc rad nemam... A pro rejpaly : ANO, JE TO SEMINARKA PRO KAMOSE
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  2. #2
    Senior Member minceVIP Avatar uživatele sisi
    Založen
    24.02.2003
    Bydliště
    Auckland, NZ
    Příspěvky
    2 176
    Vliv
    294

    Standardní

    Uz uplne na zaciatku v main... pointre vstup, s1 & s2 nereferencuju ziadnu dopredu alokovanu pamat. Chce to nieco ako:
    Kód:
    vstup = &#40;char *&#41; malloc&#40;256&#41;; // alokujeme 256 bytes
    alebo deklaraciu ako char array:
    Kód:
    char vstup&#91;256&#93;;
    Intel Core 2 Duo E6600 @ 3.2GHz (8 * 400MHz) @ 1.3V with Zalman CNPS9500 AT @ 1800RPM, ASUS P5B Deluxe/WiFi, 2x1GB Corsair Twin2X PC2-6400 DDRAM @ 400MHz (4-4-4-12) @ 2.1V, Leadtek 8800GT 512MB, WD Caviar SE16 250GB, Asus DRW-1608P3S, Creative SB Audigy Value, Logitech X-230 speakers, Enermax Liberty 400W, 2x120mm Thermaltake case fan @ 1800RPM, Thermaltake Aguila black case, HP LP2065 LCD, Logitech MX400

  3. #3
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    358

    Standardní

    To druhy zavrhuju, protoze retezce maji byt libovolne dlouhe... Ale s tim prvnim to zatim funguje, jsem trdlo... thx
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  4. #4

    Standardní

    Pri tom malloc() nezabudni na free(). A tu funkciu asi treba prerobit, aby vysledok zapisovala do bufferu, ktory sa jej posle ako parameter, inak to nebude dobre (bud malloc() bez free() alebo free() a potom to vrati pointer na tu uvolnenu pamat).
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  5. #5
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    358

    Standardní

    2Rainbow : Fakt to nechapu Mohl bys prosim uvest nejakej konkretni priklad? A s tim free, proc?
    Jinak me jeste napadlo - kdyz maji byt retezce LIBOVOLNE dlouhe, tak je blbost tam psat malloc (256), ne? Protoze to natvrdo alokuju 256 bytu a to nemusi pri delsim retezci stacit, right? Jak by se to dalo udelat, abych tam mohl dat opravdu LIBOVOLNE dlouhe retezce?

    Jo a jeste, jak na nacitani z klavesnice?

    Kdyz dam scanf("%s", vstup), tak mi to nacte retezec jen do prvni mezery, tedy napriklad pri vstupu z keyboard "Ahoj vsichni!" to nacte jen "Ahoj"... Pokud mezeru vynecham, je to v poho... NEvite nekdo co s tim, pls?
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  6. #6

    Standardní

    Toto je prvy pripad:
    Kód:
    char *NajdiNahrad&#40;char *vstup, char *s1, char *s2&#41; &#123;
        char *pracovni;
        pracovni = &#40;char *&#41; malloc&#40;256&#41;;
        /* blabla */
        return pracovni;
    &#125;
    Vzdy pri pouziti funkcie alokujes pamat a nikdy ju neuvolnujes - memory leak.

    Toto je druhy pripad:
    Kód:
    char *NajdiNahrad&#40;char *vstup, char *s1, char *s2&#41; &#123;
        char *pracovni;
        pracovni = &#40;char *&#41; malloc&#40;256&#41;;
        /* blabla */
        free&#40;pracovni&#41;;
        return pracovni;
    &#125;
    Tu sice pamat uvolnis, ale ten pointer, co si vratil, je neplatny. Ukazuje do pamati, ktora nie je alokovana.

    Malo by to byt takto:
    Kód:
    char *NajdiNahrad&#40;char *vstup, char *s1, char *s2, char *vystup, int max_dlzka&#41; &#123;
        char *pracovni;
        pracovni = &#40;char *&#41; malloc&#40;256&#41;;
        /* blabla */
        strncpy&#40;vystup, pracovni, max_dlzka&#41;;
        free&#40;pracovni&#41;;
        return vystup;
    &#125;
    Pricom vystup musi ukazovat na nejaku alokovanu pamat velkosti max_dlzka.
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  7. #7

    Standardní

    Citace Původně odeslal D_a_v_i_d
    2Rainbow : Fakt to nechapu Mohl bys prosim uvest nejakej konkretni priklad? A s tim free, proc?
    Jinak me jeste napadlo - kdyz maji byt retezce LIBOVOLNE dlouhe, tak je blbost tam psat malloc (256), ne? Protoze to natvrdo alokuju 256 bytu a to nemusi pri delsim retezci stacit, right? Jak by se to dalo udelat, abych tam mohl dat opravdu LIBOVOLNE dlouhe retezce?

    Jo a jeste, jak na nacitani z klavesnice?

    Kdyz dam scanf("%s", vstup), tak mi to nacte retezec jen do prvni mezery, tedy napriklad pri vstupu z keyboard "Ahoj vsichni!" to nacte jen "Ahoj"... Pokud mezeru vynecham, je to v poho... NEvite nekdo co s tim, pls?
    tak použij gets

    printf("Zadejte volbu: ");
    gets(str);

  8. #8
    Senior Member minceVIP Avatar uživatele sisi
    Založen
    24.02.2003
    Bydliště
    Auckland, NZ
    Příspěvky
    2 176
    Vliv
    294

    Standardní

    Citace Původně odeslal D_a_v_i_d
    2Rainbow : Fakt to nechapu Mohl bys prosim uvest nejakej konkretni priklad? A s tim free, proc?
    Lebo ked si tu pamat raz alokujes, tak je slusne ju aj uvolnit akonahle ju uz viacej nepotrebujes...
    Jinak me jeste napadlo - kdyz maji byt retezce LIBOVOLNE dlouhe, tak je blbost tam psat malloc (256), ne? Protoze to natvrdo alokuju 256 bytu a to nemusi pri delsim retezci stacit, right? Jak by se to dalo udelat, abych tam mohl dat opravdu LIBOVOLNE dlouhe retezce?
    Musis vediet dlzku toho retazca... potom si mozes alokovat presne tolko pamate, kolko potrebujes. Nikdy nebudes mat dost pamate na lubovolne dlhe retazce...
    Jo a jeste, jak na nacitani z klavesnice?

    Kdyz dam scanf("%s", vstup), tak mi to nacte retezec jen do prvni mezery, tedy napriklad pri vstupu z keyboard "Ahoj vsichni!" to nacte jen "Ahoj"... Pokud mezeru vynecham, je to v poho... NEvite nekdo co s tim, pls?
    To je normalne spravanie sa scanf()... skus sa poobzerat po niecom ako fgets().

    EDIT: Dnes som nejaky pomaly...
    Intel Core 2 Duo E6600 @ 3.2GHz (8 * 400MHz) @ 1.3V with Zalman CNPS9500 AT @ 1800RPM, ASUS P5B Deluxe/WiFi, 2x1GB Corsair Twin2X PC2-6400 DDRAM @ 400MHz (4-4-4-12) @ 2.1V, Leadtek 8800GT 512MB, WD Caviar SE16 250GB, Asus DRW-1608P3S, Creative SB Audigy Value, Logitech X-230 speakers, Enermax Liberty 400W, 2x120mm Thermaltake case fan @ 1800RPM, Thermaltake Aguila black case, HP LP2065 LCD, Logitech MX400

  9. #9
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    358

    Standardní

    Jasne, dik! Uz jsem toho koukam HODNE zapomnel Prubnu to, snad uz to konecne bude fungovat, dik moc

    EDIT : Tak dik moc, vcera vecr jsem to konecne prinutil fungovat Jinak drobnejch chybicek tam bylo jako nasr...

    Napadla me jeste takova otazka - DA SE TO VUBEC, alokovat si pamet pro retezec presne podle jeho delky? Protoze je to takovej bludnej kruh, ze? Musim nejdriv alokovat

    retezec = (char *) malloc.......

    abych do toho mohl vubec nejak adekvatne zapisovat, ale presnou hodnotu KOLIK alokovat bych ziskal az tady , pouzitim sizeof(retezec), ze? Da se tohle nejak obejit? Samozrejme chapu, ze se da VZDYCKY vymyslet retezec, kterej se do pameti nevejde, ale zajima me, jak se da tohle zaridit, jestli se to da? Protoze jak jsem o tom premyslel, tak jsem se porad tocil dokola - potrebuju zjistit velikost neceho, co ale musim nejdriv nacist, a tim padem tomu i tu pamet naalokovat

    P.S: Jediny, co me tak napada, je naalokovat si nejakej "buffer" s dostatecne velkou rezervou, tam ty retezce ukladat do "meziskladu", zjistit jejich velikost, a pak jim naalokovat jejich ukazatel presne na "miru", jinak nevim
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  10. #10
    Senior Member mince Avatar uživatele KtK
    Založen
    16.10.2002
    Bydliště
    Behind fuc*ing WorkTable Device (Praha zapad)
    Příspěvky
    1 709
    Vliv
    298

    Standardní

    nerad bych se mylil, ale sizeof(retezec) ti vrati velikost pointeru (vetsinou 4B)
    to uz spis strlen
    edit: ted jsem to zkousel, a je to tak.
    Parasite lost, AKA the Girlfriend Mission:The Socka Project sleeps, lets use (her :) Durex! 1GHz in some soltek stuff, Ati rage 128, etc.. (it\'s noisy)
    IMB Thinkpad R31: celer 1.2GHz, 384M RAM, 60GB 5400rpm hitachi, i810 8MB onboard (na praci to staci ;)
    [pro archivni ucely] janina overclockerska poradna (.tar.gz, 1.1MB, otevrete si index.html v browseru podporujicim javascript a frames)

  11. #11
    Senior Member Avatar uživatele D_a_v_i_d
    Založen
    08.12.2002
    Bydliště
    Praha
    Věk
    44
    Příspěvky
    5 153
    Vliv
    358

    Standardní

    Eee, sorry, sem to blbe napsal, myslel jsem samozrejme strlen

    Kazdopadne mi jeste nikdo nepotvrdil nebo nevyvratil moji puvodni domnenku, jde tedy naalokovat pamet presne pro retezec, ktery potrebuju? Nebo je to proste potreba delat "s dostatecnou rezervou" a modlit se?
    A Jedi gains power through understanding; a Sith gains understanding through power

    Destkop machine: Intel Core i5 2400/MSI P67A-C45 /2x4 GB DDR3 1333 MHz/Sapphire HD6790/22" LCD HP w2216/DSL 8MBit connected
    Na filmy v posteli: Lenovo IdeaPad S9e/1,6 GHz Intel Atom, 1 GB RAM, 80 GB HDD
    Na práci: Dell E5500/T9550 2,66 GHz Intel, 3 GB RAM, 120 GB HDD

  12. #12
    Senior Member
    Založen
    21.10.2002
    Bydliště
    Liberec
    Příspěvky
    517
    Vliv
    282

    Standardní

    Nevim jak ty retezce nacitas nebo co.. nebo jestli ho nactes celej naraz, ale jestli to nacitas odnekud po znaku, tak si naalokuj treba 20 bajtu a kdyz ti to nebude stacit, prehod si to do nakyho jinyho retezce, zrus alokaci a naalokuj 40 bajtru treba, vratis to zpet a ctes dal.. kdyz ti nebude stacit ani 40 bajtu tak znova, prehodis ho na chvilku jinam, zrusis alokaci, naalokujes 60, nebo 80 nebo proste kolik budes chtit a tak pord dokud ten retezec nenactes a pak podle jeho dylky muzes naalokovat presne tolik kolik potrebujes.

  13. #13

    Standardní

    Citace Původně odeslal man gets
    Never use gets(). Because it is impossible to tell with­
    out knowing the data in advance how many characters gets()
    will read, and because gets() will continue to store char­
    acters past the end of the buffer, it is extremely danger­
    ous to use. It has been used to break computer security.
    Use fgets() instead.
    cize pouzijes
    Kód:
    char *fgets&#40;char *s, int size, FILE *stream&#41;;
    nejako takto:
    Kód:
    char buf&#91;20&#93;;
    fgets&#40;buf, sizeof&#40;buf&#41;, stdin&#41;;
    1: Asus P2B 1.10 • Celeron 1100@1364/1.8V • 512MB SDRAM • Samsung SP1213N+WD AC28400 • Toshiba XM-6402B+SD-M1212 • PowerColor AR2L Radeon 9100 64MB • 3C900-Combo • Bt848A • ASB-3940UA • AWE-64 • DTK PTP-3007 • VisionMaster 405 • Umax UC630 • Star LC24-200 Colour 2: PCPartner TXB820DS • Cyrix MII PR300/1.8V • 256MB SDRAM • 2xSamsung HD400LD+IT8212F • Accesstek CW4001 • LS-120 • Mystique 4MB • Millennium II 4MB • 3C509 • CMI8329A+Dream MIDI • ADI ProVista E44 • SyncMaster 203B Notebook: DTK FortisPro TOP-5A • P166MMX/1.8V • 80MB EDO • Hitachi 5K80 40GB • 12,1" TFT Router: A-Trend ATC-1425B • i486DX 50@33/5V • 48MB FPM • WD AC14300 • UMC UM9003F • HP PC LAN 16/TP+ Car: Mazda 323P BA • Z5 1489ccm, 65kW@5500rpm, 134Nm@4000rpm

  14. #14

    Standardní

    Citace Původně odeslal D_a_v_i_d
    Eee, sorry, sem to blbe napsal, myslel jsem samozrejme strlen

    Kazdopadne mi jeste nikdo nepotvrdil nebo nevyvratil moji puvodni domnenku, jde tedy naalokovat pamet presne pro retezec, ktery potrebuju? Nebo je to proste potreba delat "s dostatecnou rezervou" a modlit se?
    no a co to udelat takhle:

    Kód:
     // na zacatku vyalokujeme misto pro retezec o delce 2 znaky 
     // &#40;dalo by se to myslim prepsat i tak aby nebylo treba alokovat nic...
     char *a = &#40;char*&#41; malloc&#40; sizeof&#40;char&#41; * 2 &#41;;
     // pomocna promena pro delku retezce
     size_t i = 0;
    
     // nacitame po znacich dokud neni konecradku &#40;nebo neco jineho&#41;
     while &#40; &#40; a&#91;i&#93; = &#40;char&#41; getch&#40;&#41; &#41; != '\n' &#41; &#123;
       // a umele ukoncime retezec na pozici za nactenym znakem
       a&#91;++i&#93; = '\0';
       // vyalokujeme si vice pameti &#40;o jeden char navic&#41;
       a = &#40;char*&#41; realloc&#40;a, sizeof&#40;char&#41; * &#40;strlen&#40;a&#41; + 1&#41; &#41;;
     &#125;
     // retezec je nacteny v a... staci ho jen vypsat...
     printf&#40; "%d\n%s\n", strlen&#40;a&#41;, a &#41;;
    
     // konec prace s retezcem
     free&#40;a&#41;;
    na zacatku potrebujes jen 2-velikosti-charu a na konci.... pamet na cely tvuj ohromny retezec, da se to samozrejme prepsat i na jakykoliv jiny datovy typ... atd. akorat nevim jestli to pojede v klasickem C.
    zde býval podpis...

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •