Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] Elektromos rásegítésű kerékpárok
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
- [Re:] [sziku69:] Szólánc.
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] Gurulunk, WAZE?!
- [Re:] [attilasd:] A laposföld elmebaj: Vissza a jövőbe!
- [Re:] [Szevam:] Érzelmi magabiztosság/biztonság - miért megyünk sokan külföldre valójában?
- [Re:] [ldave:] New Game Blitz - 2024
- [Re:] ZUK Z2 - Kicsi a bors, de erős!
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
GAMEPOD.hu témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
cellpeti
veterán
üdv!
Nekem lenne egy progim,ami bekéri a motor teljesítményét lóerőben,utánna meg be kell kérni a hengerűrtartalmat ccm-be.
Ha a teljesítménynél üres sort adunk be,akkor ki kell lépnie. De ha nem számot adtál be,akkor is dobjon egy hiba üzit,mind a teljesítménynél,mind a hengerűrtartalomnál. Addig meg van,hogy bekéje mind2t.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int getline(char s[],int lim){
int i,c;
for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n')
c=getchar();
return (i);
}
int ell(char s[])
{
int i,h,ok=1;
h=strlen(s);
for(i=0;i<h;i++) { if (!isdigit(s[i])) ok=0;}
return ok;
}
void main(void)
{
int ok,loe,kobc;
char loero[10],ccm[10];
do
{
ok=0;
printf("Kerem a teljesitmenyet loeroben: ");
getline(loero,10);
ok=ell(loero);
loe=0;
loe=atoi(loero);
}while(ok!=1);
do
{
ok=0;
printf("\nKerem a motor hengerurtartalmat kobcentiben: ");
getline(ccm,10);
ok=ell(ccm);
kobc=0;
kobc=atoi(ccm);
}while(ok!=1);
printf("\nA motor loereje: %dLE\n",loe);
printf("\nA motor hengerurtartalma: %dccm\n\n",kobc);
}
[ Szerkesztve ]
Tigris, tigris, csóvafény...
cellpeti
veterán
Na eddig megvan az,hogyha üres sort adok meg akkor kiírja,illetve csak a számokat fogadja el és akkor is kiírja a hiba üzeneteket!
Olyat szeretnék még kérdezni,hogy mikor üres sort adok meg neki,akkor kilépjen a progi??
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int getline(char s[],int lim){
int i,c;
for (i=0;i<lim && (c=getchar())!=EOF && c!='\n';++i)
s[i]=c;
s[i]='\0';
while (c!=EOF && c!='\n')
c=getchar();
return (i);
}
int nume (char s[])
{
int i;
if(s[0]=='-' || s[0]=='+')i=1; else i=0;
for(; s[i]; ++i)
if (s[i]<'0' || s[i]>'9') return 0;
return 1;
}
void main(void)
{
int ok,loe,kobc;
char loero[10],ccm[10];
do
{
ok=0;
printf("Kerem a teljesitmenyet loeroben: ");
if(!getline(loero,10))
{
printf("Ures sort adott meg!\n");
ok=1;
}
else
{
if(!nume(loero))
{
printf("Nem szam a bekert karakter!\n");
ok=1;
}
else
loe=atoi(loero);
}
}while(ok==1);
do
{
ok=0;
printf("Kerem a motor hengerurtartalmat kobcentiben: ");
getline(ccm,10);
ok=nume(ccm);
kobc=atoi(ccm);
}while(ok!=1);
printf("\nA motor loereje: %dLE\n",loe);
printf("\nA motor hengerurtartalma: %dccm\n\n",kobc);
}
Tigris, tigris, csóvafény...
Karma
félisten
Kilépéshez használd az exit(0) függvényt
Egyébként van egy teljesen felesleges rész: a nume-t és az atoi-t simán összevonhatod egy sscanf hívásba, amivel két legyet ütsz egy csapásra: ha nem szám, akkor 0-t ad vissza (megvan a hibadetektálás), ha szám, akkor meg 1-et, és a paraméterben átadott változóban ott lesz az érték. A használatára itt egy egyszerű példa.
[ Szerkesztve ]
“All nothings are not equal.”
cellpeti
veterán
Nem használhatok scanf()-et,csak printf()-et!
Tigris, tigris, csóvafény...
doc
nagyúr
a sscanf, scanf es printf harom teljesen kulonbozo fuggveny!
Gyuri16
senior tag
bump
/dev/input/event* megse lesz jo, mert (azon kivul, hogy nem tudom hogyan kell ertelmezni) csak root joggal lehet olvasni. nekem olyan megoldas kellene, hogy barki tudja futtatni.
Nem vagyok egoista, csak uborkagyalu!
cellpeti
veterán
értelek!
de gondolom,ha sima scanf()-et se használhatok,tuti nem nem lehet használni a sscanf()-et se!
Tigris, tigris, csóvafény...
Karma
félisten
cellpeti
veterán
Azt hogy tudnám megcsinálni,hogy a teljesítménynél,ha üres sort adok,akkor lépjen ki?
do
{
ok=1;
printf("Kerem a teljesitmenyet loeroben: ");
getline(loero,10);
ok=nume(loero);
if(ok==0) {printf("\nRossz adatbevitel! Csak szam lehet a bevitt adat!\n\n");}
else {loe=atoi(loero);}
}while(ok!=1);
Tigris, tigris, csóvafény...
Gyuri16
senior tag
most jatszottam xev-vel ez eleg jol kiirja, hogy mit nyomkodok.
koszi az olvasnivalot, megnezem (titkon remeltem, hogy fog menni valahogy egyszerubben)
Nem vagyok egoista, csak uborkagyalu!
Karma
félisten
A getline függvényed, ha jól megnézed (mintha valahol használnád is...?), a beolvasott karakterek számát adja vissza. Ez nyilván 0, ha üres sorról van szó. A getline-os sorod cseréld ki erre például:
if (!getline(loero, 10))
{
exit(0);
}
“All nothings are not equal.”
bama
csendes tag
Sziasztok srácok!!!
Nagyon megköszönnééem a segitségtenétek a c be kezdem programozni 1 ös vagyok egyetemen és a tanárunk felad egy hibás egyszerü C programot amibe van 5 hiba ahány hibát találunk annyi az érdemjegyünk!!Elég kutyaütő vagyok benne segitenétek megkeresni a hibákat benne??Nagyon megköszönném!!!
A program
int strlen(char*str){
char*tmp=*str;
if(!strt)
return 0;
while(str+#);
return*str-*tmp;
}
Lehet hogy több hiba vann benne mert a barátom egy lapra irta kézzel aztán elég rondán iirrrr
ide irnátok a teljes programot nekem kijavitvaaaaa !!NAgyon sürgös lenne!!!!!!!!!!!!!!!!!!!!
nagyon köszönom
kioto
3man
csendes tag
Adott a feladat:
int strlen(char*str){
char*tmp=*str;
if(!strt)
return 0;
while(str+#);
return*str-*tmp;
}
Eloszor is
1.)tmp egy cim, mig *str egy char
2.)nincs olyan hogy strt
3.4) while(str+#); ebbol a sorbol hianyzik egy * es egy +
5.) a visszateresi ertek int,es nem char
int strlen(char *str){
char *tmp=str;
if(!str)
return 0;
while(*str++);
return str-tmp;
}
vagy inkabb
return (int)(str-tmp);
3man
csendes tag
Ugy remlik, cimeket nem illik kivonni, akkor pedig ez a jo
return (int)str-(int)tmp;
3man
csendes tag
Az utolso sor az esetek 99.99 szazalekaban jol mukodik, de..
A cim 32 bites lehet, ahogy az int is, de az int elojeles. Ez problemat okozhat, ha a str joval 0x7fffffff alatt van, mig a karakterlanc vege joval 0x8000000 folott.
Ekkor az int-re konvertalasnal az elso szam pozitiv lesz, mig a masodik negativ., es a kulombseguk is negativ, ha a karakterlanc eleg nagy. Gyakorlatilag nem lehet akkora karakterlancot letrehozni, hogy a hiba elojojjon, de ez akkor is hiba.
A visszateresi erteknek unsigned int-nek kellene lennie.
erdemes probalgatni, mikor lesz negativ az eredmeny, es mikor nem.
int a=0xbfffffff;
a-=0x30000000;
printf("%d \n",a);
3man
csendes tag
es nem mindegyik ir ronda
xd
cellpeti
veterán
Milyen függvénnyel lehet pl *-ból egy kis keretet csinálni,akár az egész ablak köré,de akár egy pár sok köré?
Tigris, tigris, csóvafény...
bama
csendes tag
3man nagyon köszönöm neked a segitséget!!!!
3man
csendes tag
Ez nagyon alapszint, gondolom azert nem valaszolt senki.
Ha mar alapszint. Mikor mutato valami, es mikor char?
Ehhez csak a definiciot kell mindig megnezni.
Az str igy volt definialva
int strlen(char *str)
Ezt fel lehet bontani tobbfelekepp.
char * , str
char , * str
Ebbol mar latszik, mikor mit jelent a kifejezes. Ha csak str-t irok, akkor az char *
ha *str-t, akkor az char.
Lehetne ilyen is a definicio
char **str
Ekkor tobb felbontasi lehetoseg kinalkozik. De a definiciobol mindig lehet tudni, mit jelent az adott kifejezes. Az utobbinal **str az char tipust ad, mig *str egy char *-ot.
A c nyelvben a mutato egyben egy tomb elso elemere is mutat.
Tehat a char *str megegyezik a char str[] definicioval. Ebbol kovetkezik, hogy minden mutatot indexelhetunk, mint egy tombot, es minden tomb neve egyben mutato, ami egy cimet tarol.
shev7
veterán
miert is nem illik cimeket kivonni? siman kivonhatoak egymasbol es megadja a string hosszat
btw szerinted ez mit csinal? vagyis inkabb mikor lesz igaz?
*str++
[ Szerkesztve ]
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
Karma
félisten
Most olvastam a hivatalos dokumentációban (Stroustup C++ könyve), hogy pointert csak akkor szabad kivonni egymásból, ha azonos tömbre mutatnak. Szerencsére ez a példakódban lévő karaktertömb esetében teljesül.
[ Szerkesztve ]
“All nothings are not equal.”
shev7
veterán
hat maskulonben tenyleg nincs sok ertelme... keves egyebb felhasznalasi teruletet tudom elkepzleni a pointerek kivonasanak
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
3man
csendes tag
Igy van, a pointer nem azert van, hogy szamoljunk vele. De mukodik a dolog, mert a forditok megengedik.
shev7
veterán
megengedik? azert annal kicsit tobbrol van szo...
az strlen fuggveny is ugy van implementalva, hogy a visszateresi ertek pointerek kulonbsege, pont mint a peldaban...
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
3man
csendes tag
Nyilvan jobban tudod..
Karma
félisten
Vagy csak szorgalmasabb volt, és megnézte egy C library forrását.
“All nothings are not equal.”
Sk8erPeter
nagyúr
Tényleg, ha már pointerek és tömbök hasonlóságáról van szó, kérdeznék: tanultuk, hogy hasonlóság van a kettő között, de van különbség memóriakezelésben. Milyen szempontból?
Ha pointerként hivatkozol (pl. int *p) az elvileg ugyanazt adja, mint a tömb első (nulladik) elemének címe. De akkor mi a jelentős különbség?
Sk8erPeter
shev7
veterán
tomb merete fix
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
Karma
félisten
A pointer mérete is fix 32 bites architektúrán 32 bit például.
Szerintem arra céloztak anno a hasonlósággal, hogy a subscript operátor valójában ekvivalens egy kis pointeraritmetikával.
int array[5];
int* pointer = array;
array[5] === pointer[5] === *(pointer+5) // ekvivalensek
De most hogy nézem, rájöttem a különbségre is: míg a pointer szabadon módosítható, a tömbváltozó nem, konstans értéke van.
“All nothings are not equal.”
cellpeti
veterán
Üdv!
Letöltöttem a Code Blocks-ot.
Intel C/C++ Compiler álítottam be neki.
Megnyitottam benne egy C-Free-ben írt programot,ami lefutott ott is és TC-be is. Majd mondom neki,hogy futassa(F9) és meg sem mozdul. Tudna valaki segíteni ebben?
Tigris, tigris, csóvafény...
Karma
félisten
Van fenn egyáltalán Intel C/C++ fordítód? MSYS-es GCC szokott lenni mellécsomagolva, szerintem azt kellett volna választanod. De emlékeim szerint még külön mutatja is, mit detektál.
“All nothings are not equal.”
cellpeti
veterán
shev7
veterán
ugy ertettem, hogy ha pointert mint tombot hasznalunk futasi idoben valtoztathato a "tombnek" a merete. Ha arra van szukseg fogod es nagyobbat foglalsz
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
Sk8erPeter
nagyúr
"míg a pointer szabadon módosítható, a tömbváltozó nem, konstans értéke van."
Most ezt nem nagyon értem: a tömbváltozó is módosítható. Mármint a tömbben tárolt érték. Nyilván a pointer átállítható, hogy más elem címére mutasson.
Na de akkor mi a releváns különbség a memóriakezelésben?
(#1383) shev7 : ezt sem értem, mert dinamikusan is, futásidőben is lehet memóriát foglalni tömbnek, attól függően, hogy mondjuk mekkora egy másik tömb, aminek az elemeit át szeretnénk másolni egy új tömbbe, attól függően módosítjuk a foglalt memóriaméretet.
_______________________________________________________
(#1380) cellpeti: nem értem, minek állítgattad át? Letöltöd, telepíted, működik. Tök felesleges állítgatni valamit, ha nem tudod, mi az...
[ Szerkesztve ]
Sk8erPeter
Karma
félisten
A tömbváltozó alatt én az "array"-t értettem, ami gyakorlatilag egy pointer az első elemre. Ez a konstans, nem lehet elállítani onnan, ellentétben egy pointerrel.
Tehát nem lehet olyat mondani, hogy
array = pointer + 1;
[ Szerkesztve ]
“All nothings are not equal.”
Sk8erPeter
nagyúr
Asszem értem. Köszi a felhomályosítást!
Sk8erPeter
cellpeti
veterán
Az elején muzály választani,mert különben nem enged tovább!
Tigris, tigris, csóvafény...
cellpeti
veterán
Sziasztok!
CodeBlocks-ban nem lehet tenni ]-et???
Tigris, tigris, csóvafény...
Karma
félisten
De lehet, csak az Alt+G-n már van egy másik shortcut A beállítások között ki kell törölni. Úgy emlékeztem, hogy csak a Dev C++-ban van ilyen szívás...
Szerintem egyébként az angol billentyűkiosztás sokkal jobb a kódoláshoz, a Windows magyarja nagyon gáz
“All nothings are not equal.”
shev7
veterán
"ezt sem értem, mert dinamikusan is, futásidőben is lehet memóriát foglalni tömbnek, attól függően, hogy mondjuk mekkora egy másik tömb, aminek az elemeit át szeretnénk másolni egy új tömbbe, attól függően módosítjuk a foglalt memóriaméretet."
En ugy tudom, hogy tombre ilyet nem lehet. Ha azt mondom, hogy int x[5] akkor az elete vegeig 5 elemu tomb lesz. Sot en ugy tudom standard C-ben olyan sincs hogy
f(int x){
int array[x];
}
Ellenben ha fogsz egy pointert akkor a pointerrel akkora teruletet foglalsz le amekkorat akarsz, es futasi idoben ugy varialod ahogy akarod.
Es a memoriakezelesrol:
Ha a tombodet nem globalis valtozokent deklaralod, akkor a tombnek a helyet a stack-en foglalja le. Ugyan ez igaz a pointer-re is, tehat a pointer altal mutatott cim is a stack-en lesz. Ellenben, ha a pointer-hez allokalsz memoriateruletet, azt mar a heap-en fogja lefoglalni.
[ Szerkesztve ]
''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''
Karma
félisten
Így van, a tömböknek fix a mérete.
Tegnap éjjel én is ezt akartam írni, csak aztán feladtam
“All nothings are not equal.”
cellpeti
veterán
A CodeBlocks-ban tudna valaki segíteni? Mert még mindig nem működik!
[ Szerkesztve ]
Tigris, tigris, csóvafény...
bpx
őstag
írták fentebb hogy állítsd át a kiosztást vagy töröld a hotkeyt
vagy írd be ascii kód szerint: alt (bal oldali) + 93
cellpeti
veterán
Nem arról van szó! Hanem arról,hogy nem futattja a progit amit írok benne. De mind1!
Most ajánlottak másik C környezetet.
Tigris, tigris, csóvafény...
bpx
őstag
ja ok, most látom volt előbb is kérdésed
miért intel compiler-t válaszottál? raktál fel külön, kiírta arra is hogy detected?
amikor futtatni próbálod, alul a logban véletlenül nem ezt írja?
"***** - Debug" uses an invalid compiler. Skipping...
Nothing to be done.
hagyd a GNU compiler-en és azzal megy rendesen
[ Szerkesztve ]
cellpeti
veterán
Az a cumi,hogy nem ír ki semmit!
Tigris, tigris, csóvafény...
cellpeti
veterán
Most GNU GCC Compileren van? az jó?
Tigris, tigris, csóvafény...
Karma
félisten
Elvileg annak kéne lennie a jónak...
“All nothings are not equal.”
Sk8erPeter
nagyúr
Akkor lehet, hogy valami fogalmi képzavar esete forog fenn nálam, vagy nem vágom,
de az alábbi példaprogram jól szemlélteti a dinamikus memóriafoglalást, amire gondoltam, itt az eredeti tömbből egy új tömbbe gyűjti az eredeti tömbben szereplő, átlag alatti számokat, és pont akkora memóriát foglalunk le az új tömbnek, amennyire szükség van, nem többet, nem kevesebbet:
#include <stdio.h>
#include <stdlib.h>
double *atlagalatt(double tomb[], int meret, int *ujmeret){
double *ujtomb;
int i, db, to;
double szum, atlag;
/* mi az atlag */
szum=0;
for (i=0; i<meret; ++i)
szum+=tomb[i];
atlag=szum/meret;
/* hany olyan van */
db=0;
for (i=0; i<meret; ++i)
if (tomb[i]<atlag)
db++;
/* foglalas es paranoia */
ujtomb=(double*)malloc(db*sizeof(double));
if (!ujtomb) {
*ujmeret=0;
return NULL;
}
/* masolas */
to=0;
for (i=0; i<meret; ++i)
if (tomb[i]<atlag)
ujtomb[to++]=tomb[i];
*ujmeret=db;
return ujtomb;
}
int main(){
double eredeti[100];
double *uj;
int ujmeret;
int i;
for (i=0; i<100; ++i)
eredeti[i]=rand()%100/10.0;
uj=atlagalatt(eredeti, 100, &ujmeret);
for (i=0; i<ujmeret; ++i)
printf("%4.2g ", uj[i]);
free(uj);
}
Szerk.: Forrás: [link]
Sőt, ha már linkeltem, itt látható a 4-es feladatban a futásidőben történő memóriafoglalás:
#include <stdio.h>
#include <stdlib.h>
char ** darabol(char *s,char *m,int *db){
int n=0,i,last=0;
char **p;
// szavak számolása
for(i=0;s[i]!=0;i++){
int j;
for(j=0; m[j]!=0 && s[i]!=m[j]; j++);
if(m[j]!=0 && i!=last){
n++;
last=i+1;
}
}
p=(char**)malloc(n*sizeof(char*));
if(p==NULL)exit(-1);
for(i=n=last=0;s[i]!=0;i++){
int j;
for(j=0; m[j]!=0 && s[i]!=m[j]; j++);
if(m[j]!=0 && i!=last){
p[n]=(char*)malloc(i-last+1);
if(p[n]==NULL)exit(-1);
for(j=last;j<i;j++)p[n][j-last]=s[j];
p[n][j-last]=0;
n++;
last=i+1;
}
}
*db=n;
return p;
}
int main(int db,char ** par){
FILE * fp;
char sor[1025];
int meret;
if(db<3)return -1;
fp=fopen(par[1],"rt");
if(fp==NULL)return -1;
while(fgets(sor,1025,fp)!=NULL){
char **p=darabol(sor,par[2],&meret);
while(meret--)free(p[meret]);
free(p);
}
}
[ Szerkesztve ]
Sk8erPeter
Vasinger!
nagyúr
Sziasztok!
Ma nyúltam először C#-hoz életemben, és el is akadtam a háziban. Már majdnem kész van, de nem tudom kipróbálni, hogy eddig jó e, mert ha futtatom, újraindul.
Emlékszem órán valamit ki kellett törölni, de sehogy sem sikerül.
Ami még szemet szúrt, hogy a sorok megvoltak számozva a suliban, itthon feltettem, de nem látom sehol sem, hogy hol kell bekapcsolni. :\
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
Mai Hardverapró hirdetések
prémium kategóriában
- Krómozott előlapos Jura Z5 automata kávéfőző beépített profi cappuccino fejjel
- Eladó teljesen új, bontatlan Nespresso Essenza mini piros színben
- Motorola Razr 40 - 8GB 256GB DualSIM Sage Green - Bontatlan - Garanciális
- Canon Ixus 285 HS
- Új! Bontatlan! Samsung 8TB 2.5 SSD eladó! Országos Szállítással