Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Úkol - řetězce v C

Aktivity
Avatar

Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
:4.2.2014 14:09

Přesně, pokud nemáš paměť tak nemáš kde ukládat. V zadání je "Uvažujte, že v s1 je alokován dostatečný prostor." => strCatA( strCatA( „Dům a“, „n“, 5), „kraji silnice“, 100), “Dům na kraji silnice“) je nesprávné použití funkce, nemělo by to funguvat.

 
Odpovědět
4.2.2014 14:09
Avatar

Člen
Avatar
Odpovídá na
:4.2.2014 14:11

tmp - temporary - dočasný, prostě název proměnné

 
Nahoru Odpovědět
4.2.2014 14:11
Avatar
Swixi
Neregistrovaný
Avatar
Odpovídá na
Swixi:4.2.2014 14:20

Aha. ok. dík moc za vysvětlení i pomoc. Já se teď C budu učit asi odtud místo od učitele. : http://www.sallyx.org/sally/c/

 
Nahoru Odpovědět
4.2.2014 14:20
Avatar
Odpovídá na
Libor Šimo (libcosenior):4.2.2014 14:21

Viem to vyriešiť ale len čiastočne a to tak, že v podmienkach pred return-om uvoľním tie časti pamäti, ktoré sa returnom nevracajú.
napr.:

// funkcia na uvolnenie pamäti
void free_memory(char *p1, char *p2, char *p3)
{
    free(p1);
    free(p2);
    free(p3);
}

char * strcatat(char *s1, const char *s2, int p)
{
    -
    if (p > strlen(s1_dyn)) {
            strcat(s1_dyn, s2_dyn);
            free_memory(pom1, s2_dyn, pom2); // zmazanie nepotrebných
            return s1_dyn; // tento bohužiaľ ostane v pamäti do konca behu programu
    -
}
[/code
Editováno 4.2.2014 14:24
Nahoru Odpovědět
4.2.2014 14:21
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
coells
Tvůrce
Avatar
coells:4.2.2014 14:29
char *strCatAt(char *s1, const char *s2, int p)
{
    char *dest = s1;
    while (p-- > 0 && *dest) dest++;
    while ((*dest++ = *s2++));
    return s1;
}
 
Nahoru Odpovědět
4.2.2014 14:29
Avatar
vitamin
Člen
Avatar
Odpovídá na
vitamin:4.2.2014 14:33

Na spravenie toho zadania nepotrebuješ poznať žiadne funkcie (stačí printf/puts ak chceš dáky výstup):

#include <stdio.h>

//zisti dlzku retazca
size_t my_strlen(const char* str){
    size_t i = 0;
    for(; str[i] != '\0'; ++i){}
    return i;
}

//prekopiruje retazec zdroj do retazca ciel
char* my_strcpy(char* ciel, const char* zdroj){
    while(*zdroj != '\0'){
        *ciel = *zdroj;
        ++ciel;
        ++zdroj;
    }
    *ciel = '\0';
    return ciel;
}

//prekopiruje retazec zdroj na koniec retazca ciel
char* my_strcat(char* ciel, const char* zdroj){

    while(*ciel != '\0')ciel++;  //najde koniec retazca
    return my_strcpy(ciel, zdroj);
}

char *strcatat(char *s1, const char *s2, int p) {
    if(p < 0 || my_strlen(s2) == 0)return 0;

    if (p >= my_strlen(s1)){
        my_strcat(s1, s2);
    }
    else{
        int i;
        const int s2_size = my_strlen(s2); // strlen nepoužívat uvnitř cyklu!

        // původní část řetězce kopíruji dozadu, aby se uvolnilo
        // místo pro řetězec s2
        for (i = my_strlen(s1); i >= p; i--)
            s1[i+s2_size] = s1[i]; // kopíruju o délku s2

        // vkládám s2 na určené místo
        for (i = 0; i < s2_size; i++)
            s1[p+i] = s2[i];
    }

    return s1;
}

int main(){

    char str[30]= "Dum a";

    strcatat( strcatat( str, "n", 4), " kraji silnice", 100);
    puts(str);
}
Editováno 4.2.2014 14:34
 
Nahoru Odpovědět
4.2.2014 14:33
Avatar
petrph
Člen
Avatar
Odpovídá na
petrph:4.2.2014 14:38

Aha.:[ Asi takhle nepočítej s tím že tu učitelé při výuce programování naučej úplně všechno. To se předpokládá že jako programátor si najdeš většinu věcí sám v online dokumentaci..Popisy funkcí,jejich parametry, návratové hodnoty atd, obvykle tam jsou i příklady.. Pamatuju dobu když jsem ještě kdysi začínal programoval v céčku, tak jsem měl vedle položenej asi 200 stránkovej manuál s těmahe knihovníma funkcema kde jsem si to hledal.

Ale ten malloc, ten musíš pochopit,jinak je ta práce s řetězci v C dost nebepečná. Jde o to že ty když deklaruješ v C text. řetězec s proměnnou typu char *s tak tím nemáš přiřazený žádný prostor kam by jsi ty znaky v řetězci mohl ukládat, takže jak jsi sám psal by sis mohl přepsat jiné informace. Čili až když napíšeš char *s = (char *) malloc(100);
tak až tím máš zajištěný prostor v proměnné s pro uložení až 100 znaků v text. řetězci..

 
Nahoru Odpovědět
4.2.2014 14:38
Avatar
Odpovídá na coells
Libor Šimo (libcosenior):4.2.2014 14:47

Veľmi pekne napísané, ale ešte tam chýba prilepenie odrezanej časti prvého reťazca na koniec reťazca.

Nahoru Odpovědět
4.2.2014 14:47
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
coells
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
coells:4.2.2014 14:54

Díky za upozornění, Libco, ale nechybí. Funkce strcat dělá konkatenaci, nikoliv insert. Stejně tak NULL jako návratová hodnota je z hlediska designu knihovních C funkcí nesmysl.

 
Nahoru Odpovědět
4.2.2014 14:54
Avatar
Swixi
Neregistrovaný
Avatar
Odpovídá na petrph
Swixi:4.2.2014 15:17

Dík za vysvětlení :)

 
Nahoru Odpovědět
4.2.2014 15:17
Avatar
Odpovídá na coells
Libor Šimo (libcosenior):4.2.2014 16:19

Nemalo byť v kóde return dest; namiesto return s1; ?

Nahoru Odpovědět
4.2.2014 16:19
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 61.