Diskuze: Úkol - řetězce v C
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 61.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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/
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
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);
}
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..
Veľmi pekne napísané, ale ešte tam chýba prilepenie odrezanej časti prvého reťazca na koniec reťazca.
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.
Nemalo byť v kóde return dest; namiesto return s1; ?
Zobrazeno 11 zpráv z 61.