Új hozzászólás Aktív témák
-
skylaner
senior tag
válasz Sk8erPeter #1133 üzenetére
3-4
Mert a C automatikusan a string végére tesz egy '\0'-t, így tudja, h vége annak a stringnek.
Így n hosszú strignek n+1 nagyságú tömb kell.
Amikor pl te ezt írod,hogy: char a[]="abc" akkor a fordító automatikusan lefoglal +1 helyet még a \0-nak.char a[]="abc";
char b[]={'a','b','c','\0'};
printf("%d\n",sizeof(a)); // 4byte
printf("%d\n",sizeof(b)); // 4byte -
skylaner
senior tag
Nekem is lenne egy kérdésem.
Kb. 1,5 éve nem foglalkoztam a C-vel, elvileg számgép-háló 2-n ebbe fogunk programozni, így
az a gondolatom támadt, hogy nem ártana átnézni a dolgokatNa szóval lenne nekem egy bináris keresőfás programocskám, ami működik is, annyi lenne a kérdésem, h az alábbi fgv valóban felszabadítja-e a lefoglalt memóriát. Jó ez így, vagy máshogy kellene csinálni ?
typedef struct fa{
int ID;
struct fa* left;
struct fa* right;
} Fa;
........
void felszabadit(Fa* myFa)
{
if(!myFa) return;
felszabadit(myFa->left);
felszabadit(myFa->right);
free(myFa);
}
int main() {
Fa* myFa=NULL;
.........................
felszabadit(myFa);
myFa=NULL;
return 0;
}Vagy esetleg magának a pointernek a címet kellene átadni, felszabadit(&myFa) és akkor void felszabadit(Fa** myFa) ......?
[ Szerkesztve ]
-
skylaner
senior tag
-
skylaner
senior tag
válasz cellpeti #1145 üzenetére
Én így csináltam, de szerintem egyáltalán nem bonyolult.
int main(){
char a[255], b[255];
int i=0,space=0,j=0,hossz;
printf("Bemenet:");
gets(a);
hossz=strlen(a);
for(i=0;i<hossz;i++) {
if(a[i]==' ') space++;
if(a[i]!=' '){
b[j]=a[i];
space=0;
j++;
}
if(space==1){
b[j]=a[i];
j++;
}
}
b[j]='\0';
printf("Kimenet:%s\n",b);
getch();
return 0;
}Aztán biztos van egyszerűbb megoldás is,de elsőre ez jutott eszembe.(Mondjuk Perl-be egy sor lenne az egész )
[ Szerkesztve ]
-
skylaner
senior tag
Megtudnátok mondani, hogy az alábbi kód, hogyan/miért működik pointerek nélkül?
#include <stdio.h>
#define csere(a, b) { int c; c=a; a=b; b=c; }
int main()
{
int a=4, b=9;
csere(a,b);
printf("%d %d",a,b); // 9 4
return 0;
} -
skylaner
senior tag
Lenne egy egyszerű kliens-szerver progi,amiben a két fél tud egymással chatelni ill. a kliens fájlokat tölthet le a szerverről.
A kérdésem a recv()-el kapcsolatban lenne.
Ha elküldök egy üzenetet:send(client_sock,"download_over",13,0);
Akkor a fogadásnál szükség van erre?
#define BUFF_SIZE 1024
.......
char msg[BUFF_SIZE];
int len;
......
len=recv(sock,msg,BUFF_SIZE,0);
msg[len]='\0';
if(strcmp(msg,"download_over")==0) { ....}Tehát le kell zárni a stringet, vagy ez automatikusan megtörténik ?
/esetleg a send-nél 14-t kellene megadni, és akkor másolódik át automatikusan a lezáró '\0' ? /[ Szerkesztve ]
-
skylaner
senior tag
válasz Jester01 #1162 üzenetére
Kösz, eszembe se jutott ez az n-ig összehasonlító fgv.
Visszatérve egy korábbi kérdésemre: valgrind
Feltettem ubuntut,valgrind-et. Futtattam --leak-check=full --showreachable=yes paraméterekkel, sok okosságot kiírt, de hogy tudnám azt megnézni h összesen mennyi memóriát használt a progi, ne csak azt amit malloc-al foglaltam le? Mindent, lokális,globális,fgv argumentumok változói stb...
Vagy nincs ilyen lehetőség? -
skylaner
senior tag
válasz Jester01 #1164 üzenetére
Na pl:
typedef struct szam{
int a;
int b;
} SZAM;
void szum(int a,int b)
{
printf("%d\n",a+b);
}
int main()
{
SZAM* sz;
sz=(SZAM*)malloc(sizeof(SZAM));
sz->a=4;
sz->b=5;
szum(sz->a,sz->b);
free(sz);
sz=NULL;
return 0;
}sz: 4 byte
*sz: 8byte
2 int másolat: 8byteTehát ennek összesen akkor min 20byte memória kell a program egy adott pontján.
Valami ilyesmire gondoltam. -
skylaner
senior tag
válasz Geresics #3932 üzenetére
Nem tudom, mennyire kell "hülye biztosra" írni a programot, de van benne 1-2 ellenőrzés.
Ha valami nem világos kérdezz nyugodtan.#include <stdio.h>
typedef struct mydate
{
int year;
int month;
int day;
} mydate_t;
typedef struct book
{
char title[30];
char writer[30];
mydate_t published_date;
} Book_t;
void print_book_info(Book_t book)
{
printf("Konyv cime: %s",book.title);
printf("Konyv szerzoje: %s",book.writer);
printf("Konyv kiadasi datuma: %d-%d-%d\n",book.published_date.year,book.published_date.month,book.published_date.day);
}
void input_stream_cleaner()
{
char c;
while (c != '\n' && c != EOF) { c = getchar(); }
}
int main(int argv,char* argc[])
{
Book_t books[10];
int i,books_count,min;
int min_years[10], min_months[10];
int min_years_count,min_months_count,min_day_idx;
printf("Mennyi konyvet akarsz tarolni:");
scanf("%d",&books_count);
input_stream_cleaner();
if ((books_count > 10) || (books_count < 1))
{
printf("Hiba! Minimum 1 es Maximum 10 kony adatait tudom tarolni!\n");
return 0;
}
for(i=0;i<books_count;i++)
{
printf("%d. konyv cime:",i+1);
fgets(books[i].title,30,stdin);
printf("%d. konyv szerzoje:",i+1);
fgets(books[i].writer,30,stdin);
printf("%d. konyv kiadasi datuma (YYYY-MM-DD):",i+1);
if (scanf("%d-%d-%d",&(books[i].published_date.year),&(books[i].published_date.month),&(books[i].published_date.day)) != 3)
{
printf("Hibas datum formatum!\n");
return 0;
}
input_stream_cleaner();
}
/*** Legkisebb ev keresese ***/
min = books[0].published_date.year;
for(i=1;i<books_count;i++)
{
if (books[i].published_date.year < min) min = books[i].published_date.year;
}
/*** Legkisebb evbol van-e tobb ***/
min_years_count=0;
for(i=0;i<books_count;i++)
{
if (books[i].published_date.year == min)
{
min_years[min_years_count]=i; //books tomb indexet taroljuk
min_years_count++;
}
}
if (min_years_count < 2) print_book_info(books[min_years[0]]);
else /*** Tobb konyv azonos evvel ***/
{
/*** Legkisebb honap keresese ***/
min = books[min_years[0]].published_date.month;
for(i=1;i<min_years_count;i++)
{
if (books[min_years[i]].published_date.month < min) min = books[min_years[i]].published_date.month;
}
/*** Legkisebb honapbol van-e tobb ***/
min_months_count=0;
for(i=0;i<min_years_count;i++)
{
if (books[min_years[i]].published_date.month == min)
{
min_months[min_months_count]=min_years[i];
min_months_count++;
}
}
if (min_months_count < 2) print_book_info(books[min_months[0]]);
else /*** Tobb konyv azonos evvel es honappal ***/
{
/*** Legkisebb nap keresese ****/
/*** Tobb azonos nap eseten a legeloszor beirt az eredmeny ***/
min = books[min_months[0]].published_date.day;
min_day_idx = 0;
for(i=1;i<min_months_count;i++)
{
if (books[min_months[i]].published_date.day < min)
{
min = books[min_months[i]].published_date.day;
min_day_idx = i;
}
}
print_book_info(books[min_months[min_day_idx]]);
}
}
return 0;
}[ Szerkesztve ]
-
skylaner
senior tag
válasz Geresics #3935 üzenetére
Hát pedig a feladathoz nélkülözhetetlen.
Semmit nem csinál. Egyszerűen ezt a nevet adtam a saját változó típusomnak (typedef miatt)
Adhattam volna "papírsárkány" nevet is de annak nem lett volna sok értelme
(Egyébként a "_t" mint type, típus).Lehetne typedef nélkül is de akkor később többet kellene írni.
Pl.struct mydate
{
int year;
int month;
int day;
};
struct mydate published_date;[ Szerkesztve ]
-
skylaner
senior tag
válasz buherton #3938 üzenetére
Szerintem először is az algoritmikus gondolkodást kellene elsajátítani.
Ha ez meg van akkor az már teljesen másodlagos dolog, hogy hogyan, milyen nyelven, milyen szintaktikával írod le a megtervezett, elképzelt kódot.Ezekhez a feladatokhoz nem kell semmi más mint egy kis algoritmikus gondolkodás, ráadásul favágó módszerrel könnyen megoldhatók.
Mondjuk vizsga előtt illő lenne (nem csak akkor) tisztában lenni az alapvető adat struktúrákkal
-
skylaner
senior tag
válasz overclockerr #3936 üzenetére
Valóban napi 1-2 óra édeskevés.
Én is mérnöki informatikusnak tanultam, ha nem akarsz csak matekkal és programozás elmélettel + kódolással foglalkozni akkor a mérnök info jobb választás.
Vannak itt olyan jó kis tárgyak mint: elektromosságtan, elektronika, digitális technika, digitális rendszerek & számítógép architektúrák, irányítástechnika (mondjuk ez nem valami jó )Sok mérnököt, programozót keresnek itt Magyarországon is, úgyhogy igen.
Lehet jó állást találni. Külföldön meg még jobbakat is, milliós fizetéssel. -
skylaner
senior tag
válasz Geresics #3943 üzenetére
Scanf miatt.
A scanf("%d",&db) beolvassa a számot amit beírtál, de az input stream bufferen még ott marad az Enter( \n vagy \r\n) amit majd a gets() fog beolvasni. Úgyhogy a konyv.cim egy \n-t fog tartalmazni.scanf() után ki kell üríteni a buffert. Erre van több megoldás is:
- fflush(stdin); (ez nem mindig működik)
- amit én is használtam: while (c != '\n' && c != EOF) { c = getchar(); }
- lehet hogy ez is működne:
char dummy_string[10];
scanf("%d%s",&db,dummy_string)Valamit gets() használata nem javasolt, helyette fgets() használj. / fgets(string,100,stdin) /
[ Szerkesztve ]
-
skylaner
senior tag
válasz overclockerr #3948 üzenetére
Miért lenne lényegtelen?
Weblap fejlesztéssel is sok helyen el lehet helyezkedni, nagyon jó pénzekkel. -
skylaner
senior tag
válasz Geresics #3956 üzenetére
Nem a teljes kód, de a lényeg benne van.
#include <stdio.h>
void szoveg_tordelo(char* string, int char_num)
{
int i=1;
while (*string != '\0')
{
printf("%c",*string);
if (i%char_num == 0) printf("\n");
i++;
string++;
}
}
void main()
{
char* string="cseresznye";
szoveg_tordelo(string,3);
} -
skylaner
senior tag
válasz Jester01 #3959 üzenetére
(Gondolom az nem jutott eszedbe hogy nem a tökéletesen szép megoldás volt a célom, hanem csak az algoritmus leírása? Eredetileg main-t se akartam írni csak a fgv-t, de a jobb érthetőség miatt beletettem.)
Amúgy mi a gond a printf("%c",c)-vel?#include <stdio.h>
void text_fragmentation(const char* string, int char_num)
{
int i=1;
while (*string != '\0')
{
putchar(*string);
if (i == char_num)
{
putchar('\n');
i=0;
}
i++;
string++;
}
}
int main(int argv, char* argc[])
{
const char* string="cseresznye";
text_fragmentation(string,3);
return 0;
}[ Szerkesztve ]
-
skylaner
senior tag
válasz PumpkinSeed #4019 üzenetére
Például csinálsz egy structot ami a c++ MAP-hez hasonlóan kulcs-érték párt tárol.
A kulcs lesz az eredeti sztring adott karakterének indexe, az érték pedig a hozzá kódolt string.
Így nem muszáj, hogy a kódolt rész-stringek is ugyan olyan sorrendben legyenek a tömben mint az eredeti string karakterei.struct Crypt
{
int index;
char crypt_text[3]
};
struct Crypt encrypted_text[20];original_string = a l m a
0 1 2 3encrypted_text[0]:
---- index=3 (original_string[3] --> a)
---- crypt_text=3hr
encrypted_text[1]:
---- index=0 (original_string[0] --> a)
---- crypt_text=3hr
encrypted_text[2]:
---- index=2 (original_string[2] --> m)
---- crypt_text=as7
encrypted_text[3]:
---- index=1 (original_string[1] --> l)
---- crypt_text=tz5Megj: Amúgy az nem valami jó titkosító alg. ami két ugyanolyan bemenetre ugyanazt a kimenetet produkálja
a --> 3hr[ Szerkesztve ]
-
skylaner
senior tag
typedef struct bitfield
{
unsigned bit7:1;
unsigned bit6:1;
unsigned bit5:1;
unsigned bit4:1;
unsigned bit3:1;
unsigned bit2:1;
unsigned bit1:1;
unsigned bit0:1;
} bitfield_t;Ennek a sizeof() szerint miért 4 byte a mérete?
function xxxx (unsigned char num)
{
bitfield_t* mask = (bitfield_t*)#
.......
}1 byte-os adatra mutatok egy olyan mutatóval amely a fordító szerint 4 byte-os "blokkokat értelmez"...
Lehet ebből gond?[ Szerkesztve ]
-
skylaner
senior tag
válasz lockdown90 #4080 üzenetére
Ha csak fgets()-t használsz elvileg nem lehet ilyen gond.
Ha van közte scanf() akkor az a baj.
Minden scanf() után ürítsd az input stream buffert. ( hívd meg az alábbi fgv-t)void input_stream_cleaner()
{
char c=0;
while (c != '\n' && c != EOF) { c = getchar(); }
} -
skylaner
senior tag
válasz lockdown90 #4083 üzenetére
A nyil tömböd 3 elemű: nyil tomb[3];
A kolcs() fgv--ben 0-tól 10. elemig akarod bejárni a 3 elemű tömbödet.
Egyszerűen túl-indexeled.Amúgy nem csak 1 db könyv adatát kéri be, írja ki?
#define N 1
for(i=0; i<N; i++) -
skylaner
senior tag
válasz lockdown90 #4085 üzenetére
De a nyil tomb[3] !!!3 elemű!!!!
for(i=0; i<11; i++)
scanf("%d",&tomb[i].kolcsszam);
tomb[0].kolcsszam, tomb[1].kolcsszam, tomb[2].kolcsszam tomb[3].kolcsszam ... tomb[10].kolcsszam
A feketével jelzett elemek nem léteznek!Te ezt akarod:
for(i=0; i<11; i++)
scanf("%d",&tomb[N].kolcsszam[i]); -
skylaner
senior tag
válasz lockdown90 #4108 üzenetére
Mert az osszegez fgv-ben csak N-ig mész a ciklussal M helyett.
[ Szerkesztve ]
-
skylaner
senior tag
Egyre többször látom itt a forumban, hogy fgv paraméterben így szerepel egy tömb:
int osszegez(int tomb[])
és nem így:
int osszegez(int* tomb)Miért ezt használjátok?
Vagy valamiért hatékonyabb mint a második változat?[ Szerkesztve ]
-
skylaner
senior tag
válasz lockdown90 #4129 üzenetére
Nem hagyja figyelmen kívül, csak a fordító máshogy dolgozza fel mint ahogy te első ránézésre gondolnád.
2 lépésben értékeli ki a feltételt:1: a < b => 4 < 3 => nem igaz, az érték FALSE => tehát 0
2: ÉRTÉK(a<b) < c => 0<3 => ez már igaz lesz ezért fog végrehajtódni az IF igaz ága, nem pedig az else ág.[ Szerkesztve ]
-
-
skylaner
senior tag
válasz stranger28 #4193 üzenetére
Szia!
Én annyit tennék hozzá, hogy mivel 0-tól 100-ig fogsz számokat tárolni így felesleges memória pazarlás int-et használni.
unsigned char *palyak;Illetve a többi változó is lehetne char/unsigned char.
[ Szerkesztve ]
-
skylaner
senior tag
válasz buherton #4227 üzenetére
Dehát ez nem az strlen hibája.
Most azért ne használjak egy már megírt fgv-t mert lehet, hogy hibás paraméterrel hívom meg?
A fejlesztő feladata és felelőssége, hogy helyesen használja a fgv-ket.
Most akkor a memcpy se használjuk mert lehet, hogy a source adatszerkezet kevesebb byte-ból áll mint amit a 3. paraméterben megadtunk?Szerintem nem jó amit mondasz.
Tessék gondoskodni arról, hogy helyes paramétert adunk át a fgv-nek.
Az strlen() teljesen jól van megírva.
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- antikomcsi: Való Világ: A piszkos 12 - VV12 - Való Világ 12
- Az akkumulátor AI lehet a Galaxy S25 fegyvere
- Kerékpárosok, bringások ide!
- Napelem
- OLED TV topic
- Vodafone-ra áttért Digi Mobilosok
- Automata kávégépek
- E-roller topik
- Samsung Galaxy S22 Ultra - na, kinél van toll?
- Még több embert rúgott ki a Tesla
- További aktív témák...
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: Ozeki Kft.
Város: Debrecen