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ó 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
- Tudástár AMD Radeon undervolt/overclock
Általános témák
LOGOUT.hu témák
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [Mr Dini:] Mindent a StreamSharkról!
- [Re:] [bacsis:] Készülődés a BRSZK-ra
- [Re:] [Lalikiraly:] Gigabyte G5 MF notebook bemutató
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [Mr Dini:] Ha szeretnéd rootolni az LG Smart TV-d, tedd meg most!
- [Re:] Helyettesíthetik-e gépek az emberi fordítókat?
- [Re:] eBay-es kütyük kis pénzért
- [Re:] [sziku69:] Fűzzük össze a szavakat :)
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
Kurik
tag
hm...aha ez is jó progi de mi csak turbo c-t használhatunk vizsgán és azért akartam azon gyakorolni...ha másnak van ötlete azért meghallgatom
Ha tévedek, ki lehet javítani :)
bpx
őstag
tudsz:
- c++ projektet kell létrehozni (win32 console app pl.)
- wizardban bepipálod, hogy üres projekt legyen
- és C header-öket/szintaktikát használsz
(#2201) Kurik: na akkor még jobb lesz a CodeBlocks
Turbo C megenged bármit, ebben jobban megtanulsz programozni
[ Szerkesztve ]
j0k3r!
senior tag
koszonom szepen.
some men just wanna watch the world burn...
Zalaymate
senior tag
Hali!
Volna egy beadandó feladatom, amit hétfőn le kell adnom, de nekem ez még magas így csípőből és ezért kérném a segítségeteket!
Egy kis programot kell írnom sima C-ben, ami tulajdon képpen egy kis adatbázis kezelő program.
Elég ha a konzolban fut és ott írja kis a következőket:
Alap menü:
1. Új adat bevitele
2. Adat módosítása
3. Keresés
4. Listázás
5. Kilépés
Az egyes menüpontokból vissza kell tudjon lépni a főmenübe.
Az adatoknak pedig 3 tulajdonságuk kell legyen: sorszám, név, adat (szöveg)
Lenne erre ötletetek? Elég gázos a helyzet....
(= Zala =)
j0k3r!
senior tag
hello!
menuvezerleshez: do-while, switch-case
+4 sajat fuggveny (uj, modosit, keres, listaz)
some men just wanna watch the world burn...
Kurik
tag
köszi!
hiszek nektek...
Ha tévedek, ki lehet javítani :)
Peteeke
csendes tag
Szia!
Nekem volna erre egy példám.
Nekem is kelett ilyen menüszerkezetet csinálnom.
int main()
{
int ch;
while(ch!=27)
{
menu();
ch=getch();
switch(ch)
{
case'1':ascii();break;
case'2':file();break;
case'3':kor();break;
case'4':szamol();break;
}
}
return 0;
}
void menu()
{
printf("\n\n\t M\tE\tN\tU\t\n");
printf("\n\n");
printf("\t1. ASCII kodtabla\t\n");
printf("\t2. Szoveges fajl letrehozas\t\n");
printf("\t3. Kor keruletenek es terulet‚nek kiszamitasa\t\n");
printf("\t4. Szamologep\t\n");
printf("\tESC Kilepes\t\n");
}
Íme ittvan.a menüt switch -case sel oldaottam meg a ch!=27 aztjelenti,hogy Esc-re kilép.A Menük nevei külön függvényben vannak.Ez egy komplett menü,Ha ezt beírod márcsak hozzáírod a többi alfv-t és kész
A processzor füsttel működik. Ha kimegy belőle a füst, nem működik tovább.
CPT.Pirk
Jómunkásember
Ha így kérek be szöveget:
int main(int argc, char **argv)
Akkor hogy lehet hozzá alakítani az strlen függvényt?
strlen:
int strlen(const char *s)
{
int len = 0;
while(*s++) len++;
return len;
}
Meg kellene számolnom a bemenetre érkező betűket az strlen() használata nélkül.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
bpx
őstag
mintha valami lemaradt volna
CPT.Pirk
Jómunkásember
Valami biztos, de honnan? Csak a lényeget copyztam be.
Szóval a standard inputra érkező karaktereket szeretném megszámolni.
Pl. progi.exe asd fgh jklm
Az simán megy, hogy hány argumentumom van, meg azokat ki is tudom íratni, de argumentumot karakterenként kiírni nem tudom, az nem akar sikerülni.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
Gyuri16
senior tag
remelem ez segit:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
int i;
for (i=0; i<argc; i++) {
printf("argv[%d] = ",i);
printf("%s\n", argv[i]);
printf("strlen: %d\n", strlen(argv[i]));
printf("betunkent:\n");
int j = 0;
while (argv[i][j++]) {
printf("%c\n", argv[i][j]);
}
// pointeresen:
char * a = *(argv+i);
while (*a++) {
printf("%c\n", *a);
}
}
return 0;
}
Nem vagyok egoista, csak uborkagyalu!
bpx
őstag
a szövegbekérést hiányoltam, de most már látom, hogy a parancssori argumentumokra gondoltál
a problémát még mindig nem teljesen értem, ha már sikerült kiíratni az argumentumokat egyenként, akkor a hossznak is mennie kellene
ha az argv-t próbálod karakterenként kiíratni az nem fog menni (char ** ugye)
ciklussal végigmész az argv-n, azzal minden egyes lépésben egy adott argumentumot vizsgálsz, egy belső ciklussal meg magán az aktuális argumentumon mész végig, pl.
int i, j = 0;
for (i = 0; i < argc; i++)
{
printf("argv[%d] - ", i);
for (j = 0; argv[i][j]; j++)
{
printf("%c", argv[i][j]);
}
printf(", hossz: %d\n", j);
}
szerk: ja persze, én közben telefonáltam is és megelőztek
[ Szerkesztve ]
CPT.Pirk
Jómunkásember
Köszi srácok! A belső ciklust felejtettem el megcsinálni, így most jó lett:
- a szóközt is számolom, az első szóköz és a lezáró 0 közti karaktereket számolja
#include <stdio.h>
int i, j, len = 0;
int main(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}
Hogyan lehet az argc, *argv[] -vel bekért karaktereket egy másik függvény számára átadni? Igazából úgy lenne frankó, ha a számolás nem a mainben lenne, bár így sem rossz.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
bpx
őstag
ezzel csak az a gond, hogy pl. a
progi.exe asd fgh jklm
és a
progi.exe asd fgh jklm
is jó, de az argc.,argv mindkét esetben ugyanaz lesz, szóval a szóközöket én nem számolnám
paraméterként meg nyilván úgy lehet, ahogy a main is kapta
CPT.Pirk
Jómunkásember
Hmm, ezen az argc argv-s módon egyáltalán van lehetőség a szóközök számolására? Mert ha csak egy sima stringem van, akkor ott simán meg lehet számolni benne mindent, de így meg nem érkezik szóköz a bemenetre...
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
Jester01
veterán
1. A programokat az operációs rendszer indítja, tipikusan másik programok kérésére. A main függvény argv/argc paraméterei a c/c++ nyelv szabványosított formája a program argumentumok kezelésére (mármint nem a nevükre gondolok itt, mert az ugye bármi lehet). Az argumentumokra általában nincs olyan megkötés, hogy nem tartalmazhatnak szóközt. Ha tehát a hívó program beleteszi őket, akkor te meg is fogod kapni. Vagyis csak az a kérdés, hogy a hívó programot hogy veszed rá erre. Windowson a hívó például lehet a parancsablak, a cmd.exe. Ezesetben értelemszerűen idézőjeleket használva valószínűleg jó lesz. Továbbá, ha nem platformfüggetlen kódot írsz, akkor windowson egyben is lekérheted az egész parancssort, a GetCommandLine függvénnyel (bár nem tudom a szóközökkel ezesetben mi lesz).
2. Az argv továbbadása. Az argv nem valami mágikus paraméter, csak egy sima string tömb. Mint ilyen, természetesen akár egészben akár darabokban továbbadhatod másik függvényeknek, pont úgy mint bármilyen más string tömböt. Az argc meg csak egy szerencsétlen int, azzal még ennyi gond sincs.
Jester
CPT.Pirk
Jómunkásember
Az a gond, hogy az egyszerű dolgokhoz bevált linuxos gcc-s fordítás nem akar menni nálam, vagyis a lefordított fájlt nem engedi futtatni, hozzáférés megtagadva hibát kapok, aztán emelt hozzáféréssel meg valami ) zárójelet hiányol, de nem a programom hibás, mindegy neki h. mit fordítók le, még egy hello wordnél is ez van, így most kénytelen vagyok win alatt csinálni.
Arra sajnos nem jöttem rá, hogy Linuxon CodeBlocks-al hogyan lehet lefuttatni úgy, hogy kapjon is valami argumentumokat.
Szóval akkor win alatt egyszerűen a cmd szedi ki a fölösnek ítélt spaceket?
Átírtam most külön fgv-be a dolgokat, valamint tettem bele vizsgálatot arra, ha nincs argumentum.
#include <stdio.h>
int i, j, len = 0;
int strLen(int argc, char *argv[]){
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
if(i==1){
len = 0;
}
else
len = len + (i-2);
printf("hossz: %d\n", len);
return len;
}
int main(int argc, char *argv[]){
strLen(argc, argv);
return 0;
}
warningot nem kaptam, korrekt amit csináltam?
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
kirket
csendes tag
Hali!
Sima C programba szeretnék usb joystick-ot kezelni csak nem tudom hogy lehet, a neten találtam C++-os példákat de sima C-set nem. Pedig gondolom nem lehet nehéz mert a Windowsnak van játékvezérlő kezelő alkalmazása.
Ha valaki tud valamit ajánlani vagy példa kódot adni azt meg köszönném.
doc
nagyúr
ez nem nyelvtol fugg, a platformfuggo dolgokat meg felejtsd el, foleg az elejen
hasznalj pl. SDL-t, ott nagyon egyszeruen tudsz kezelni joyt (is)
Jester01
veterán
Ha bővebbet tudnál mutatni a linuxos hibáról akkor abban esetleg tudnánk segíteni.
Ami a kódot illeti: az i,j,len változókat kirakni globálisba nem szép dolog, tedd őket bele az strLen függvényedbe. Az if (i==1) len=0 felesleges mivel ha nem volt argumentum a len úgyis nulla. Az i-t ellenőrizni pedig megtévesztő, hiszen tulajdonképpen az argc-t akarod vizsgálni (persze az értéke ugyanaz lesz, csak logikailag gubancos).
Továbbá szebb lenne, ha a kiírás nem az strLen-ben lenne, hanem a main-ben az strLen visszatérési értéke alapján.
Ha jól értem a logikát, akkor az argumentumok között egy szóközt feltételezve korrigálod a hosszt. Ez ugye addig jó amíg tényleg annyi van. Ha a felhasználó egyetlen argumentummal futtatja akkor nyilván jó eredményt fog adni egyébként.
$ cat >test.c
#include <stdio.h>
int strLen(int argc, char *argv[]) {
int i, j, len = 0;
for (i = 1; i < argc; i++)
for (j = 0; argv[i][j]; j++)
len++;
if (argc > 2) len += argc - 2;
return len;
}
int main(int argc, char *argv[]) {
printf("hossz: %d\n", strLen(argc, argv));
return 0;
}
$ gcc -Wall -O2 test.c
$ ./a.out hello world
hossz: 11
$ ./a.out "hello world"
hossz: 11
$ ./a.out hello world
hossz: 11
$ ./a.out "hello world"
hossz: 13
Jester
CPT.Pirk
Jómunkásember
Linux alatt (mint10, Ubuntu alapú) a gcc hiba nélkül megcsinálja az a.out fájlt, csak mikor futtatnám ./a.out, akkor kiírja, hogy hozzáférés megtagadva. Sudo meg sh, stb.-vel futtatva meg azt írja, hogy egy ")" hiányzik, de nem írja honnan. Az biztos, h. nem az én kódomból, mert akármit fordítok le, mindig ezt hiányolja. A 9-es mintel még simán forítottam gcc-vel.
Egyébként igen, 1szóközt feltételez a dolog, ha jól néztem, win alatt a több szóköz is csak egynek számít a cmd-ben.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
bpx
őstag
és van végrehajtási jogod az a.out-ra?
mert ha nincs, akkor ír ilyet, hogy hozzáférés megtagadva (legegyszerűbb esetben)
[ Szerkesztve ]
CPT.Pirk
Jómunkásember
Ha jól emlékszem volt, de adtam neki minden jogot a chmod-dal, és az sem segített. Ráadásul 2 telepített mint 10 van nálam, és mind a kettőn ez a helyzet.
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
tener
csendes tag
Üdv.
Segítséget kérnék C nyelvű programozásban, elakadtam egy programnál és segítségre volna szükségem! Aki tud segíteni, Neki megköszönném, és akár pénz fejében is honorálnám.
Köszönöm előre is!
j0k3r!
senior tag
hello!
esetleg leirhatnad, hogy milyen program, hol akadtal el, mutathatnal kodot is, mert ez igy szerintem eleg tag.
some men just wanna watch the world burn...
tener
csendes tag
Ez az igazság, hogy még nem mélyültem el teljesen a C programozásban, és lehet nem kéne fórumot szét offolni, hanem privátban (msn,skype stb.) tárgyalni
kolyka
csendes tag
Sziasztok!
Az a helyzet h nem értek a programozáshoz. Kaptam egy programot, ami elvileg működik és ezt be kell mutassam a tanáromnak. Csakhogy a gond ott kezdődik, hogy el is kell neki magyarázni... Szóval szeretném, hogy valami hozzáértő ember átnézné a progit és irna nekem egy kis leírást róla! A program C nyelven íródott!
Feladat: Írja meg a strlen() függvényt
Tipp: a függvény működéséről itt olvashat. (http://www.gnu.org/software/libc/manual/html_node/Copying-and-Concatenation.html#Copying-and-Concatenation)
Szükséges libc függvények: printf()
A kapott progi: (main.c)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i=0;
int strlen=0;
for(i=1; i<argc; ++i){
strlen=checkstrlen(*argv++);
printf("karakterekc:%d\n",strlen);
}
return 0;
}
És még egy hozzá: (check.c)
int checkstrlen(char *str){
int charlen=0;
if (!str)
return 0;
while(*str)
*str++;
charlen++;
return charlen;
}
Válom mielőbbi segítségeteket! Előre is köszi
CPT.Pirk
Jómunkásember
Hmm, milyen ismerős ez a feladat a villany karról.
Az első csak annyit csinál, hogy kiírja, amit a program kapott a standard input bemenetére, szavanként.
A második egy pointerrel dolgozik, de ezeket így egy fájlba kellene tenni, hogy a standard inputra érkező szöveget megszámolja karakterenként. Egyébként nem tudom, hogy a prog1-eseknek kell-e pointerrel dolgozniuk, mintha az a prog2 anyaga lenne, már régen volt. Ilyen megoldást a prog3-ban használtunk stringek nézegetésére.
Egyrészt használd a programkód gombot kód beillesztésekor, másrészt picit olvass vissza pár hozzászólást, ha már az strLen()-t írod.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
bpx
őstag
írhatunk róla leírást, de felesleges, mert a program hibás
kolyka
csendes tag
Igen villanyos vok :-) ebből én nem sokat értettem amit leirtál... Az utánad lévő hozzászóló(Zeratul) azt írta h szar a program. Ha te emléxel még erre...nagy kérés volna h írd meg a progit helyesen? mellékelve egy részletes leírással? válaszod előre is köszönöm
CPT.Pirk
Jómunkásember
Figyelj, nem állok neki kommentezni, ezt a progit nem látom át. Pár hsz-el arrébb írtam egy strlen-t, ami nem tökéletes, a több szóközt is egynek számolja, de attól független működik, és érthető.
Azt esetleg kommentezhetem, csak aztán Zamek kérdez egyet keresztbe, és hopp... Ráadásul azt a kódot is egy sorstársadnak írtam, jobbat per pill nem tudok.
Szal azt mondom, ha át akarsz menni a tárgyból, akkor a C könyvet olvasd el, aztán googlere fel, for ciklus, string műveletek, stb.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
kolyka
csendes tag
oké, köszi szépen a segítségedet! csak azt nem értem h mehetett át vele egy kolega, ha hibás a program! :-)
kolyka
csendes tag
szia! elmondanád h mi a gond a programban? mert egy kolega már át ment vele...csak az a baj h én nem értem, ha van időd megköszönném ha írnál leírást! előre is köszi
bpx
őstag
2 "apróság":
1. a checkstrlen függvényben a charlen változó növelését is a ciklusba kellene tenni, mert így ha nem üres a string, mindig 1 lesz az eredmény
while(*str)
{
*str++;
charlen++;
}
2. mainben a ciklus nem az igazi
jelenlegi formájában soha nem vizsgálja az utolsó argumentumot
a számolást 1-től kezdi, de a feldolgozást meg a 0. elemtől, így mikor eléri a ciklus végét (argc), akkor még marad 1 feldolgozatlan argumentum
legegyszerűbb pl. a ++ operátort postfix-ről prefixre cserélni (ugye az a különbség, hogy az előbbi csak a kiértékelés után növel, míg utóbbi már előtte)
strlen=checkstrlen(*++argv);
[ Szerkesztve ]
Carpigabi
csendes tag
Hali!
Tudna vlki írni / linkeli egy forráskódot, ami kiszámolja egy n csucsu graf. kromatikus számát?
Gyuri16
senior tag
ez altalanosan egy NP-teljes problema. en nem ismerek semmilyen ertelmes algoritmust, es ugy tudom nincs is ilyen, szoval marad kiprobalni az osszes lehetoseget. kesz programom nincs, de megirni nem nagy feladat.. persze lassu lesz, de jobb nincs.
google talal egy par approximalo algoritmust, esetleg azokat is ki lehet probalni, attol fugg mire kell.
Nem vagyok egoista, csak uborkagyalu!
Carpigabi
csendes tag
Egy iskolai feladathoz kellene:
Katonai egyenruhakat kellene gyártani, h a haboruban levo orszagok egymast megtudjak különböztetni.
A bemeneti adat:
1.orszag - 2. ország .... ahol 1.orszag szomszédja és ellensége a 2. orszagnak.
eredményben tehát kikell szamitani a minimalis mennyisegű (színű) egyenruhát, amire szükség van ...
Példák:
Britain - Ireland
Szükséges egyenruhák száma: 2
Britain - Ireland
France - Germany
Szükséges egyenruhák száma: 2
Britain - Ireland
France - Germany
France - Swiss
Swiss - Germany
Szükséges egyenruhák száma: 3
Gyuri16
senior tag
iskolai feladatot itt helyetted senki nem fogja megcsinalni, viszont segitunk ha elakadsz, es konkret kerdesed van.
a feladathoz:
szetosztod a grafot osszefuggo komponensekre
mindegyiknek kiszamolod a kromatikus szamat es a legnagyobb lesz a megoldas.
kromatikus szam egy osszefuggo grafhoz:
binaris keresessel. egy lepesben kibprobalod eleg e m szin (m legyen mondjuk n/2 az elejen, mivel tudjuk, hogy a kromatikus szam maximum n). ezt bruteforce csinalod.
innen a siker fuggvenyeben mindig kizarod a fel intervallumot, es megtalalod a legkisebb erteket amire meg atmegy a szinezes
Nem vagyok egoista, csak uborkagyalu!
Carpigabi
csendes tag
Nem vártam, hogy megcsináljátok, csak segitseget a kromatikus számokhoz ...
szetosztod a grafot osszefuggo komponensekre ... ezt kitudnád fejteni bővebben?
Gyuri16
senior tag
ez a pelda:
Britain - Ireland
France - Germany
France - Swiss
Swiss - Germany
ha grafnak megrajzolod ket osszefuggo komponense lesz:
1 Britain - Ireland
2 Swiss - France - Germany
| |
------------------
az elso komponens kromatikus szama 2 a masodiknak 3, ebbol a nagyobb a 3 igy az egesz grafnak is ez lesz a kr. szama.
ez az egesz csak egyszerusites. mivel a fo algoritmus bonyolultsaga exponencialis, ezert jobb, ha minel kisebb grafokon futtatod.
ezen kivul lehet optimalizalni az ismert eseteket is. vannak olyan graf osztalyok amiknek ismert a kromatikus szama. pl:
teljes graf - csucsok szama
csillag graf - 2
korgraf - 2 ha paros szamu csucsa van, 3 ha paratlan
tovabba azok a grafok amiknek 2 a kromatikus szamuk szinten konnyen felismerhetok, mert ezek pontosan a paros grafok (ha tobb mint 1 csucsuk van..)
ha akarsz kicsit gyorsitani az algoritmuson akar ezeket is be lehet vetni, mivel a fenti osztalyokat polinomialis idoben fel lehet ismerni.
[ Szerkesztve ]
Nem vagyok egoista, csak uborkagyalu!
Carpigabi
csendes tag
kösz, így már érthetőbb... de akkor a következőre h johet ki 2 :
Portugal - Spain
Spain - France
France - Germany
Germany - Czech
Czech - Slovakia
Slovakia - Poland
?
Gyuri16
senior tag
ha rendezed, akkor egy osszefuggo grafot kapsz (zarojelben a szinek), innen egyertelmu:
Portugal(1) - Spain(2) - France(1) - Germany(2) - Czech(1) - Slovakia(2) - Poland(1)
Nem vagyok egoista, csak uborkagyalu!
Sloane
csendes tag
Hello,
Egyszerűen nem jövök rá, mi lehet a hiba... fordítási hiba nincs, csak a futtatásnál nem azt csinálja amit kellene neki...
#include <stdio.h>
main()
{
float osztando, oszto, eredmeny;
printf("Osztandó= "); scanf("%f\n", &osztando);
printf("Osztó= "); scanf("%f\n", &oszto);
if(oszto = 0)
printf("HIBA\n");
else
eredmeny = osztando/oszto;
printf("Eredmény= %f\n", eredmeny);
}
Egy kis segítségre lenne szükségem.
thx.
Gyuri16
senior tag
if(oszto == 0)
felteteleknel dupla egyenlosegjelet kell irni, kulonben ertekadasnak lesz ertelmezve
Nem vagyok egoista, csak uborkagyalu!
Sloane
csendes tag
köszi, kijavítottam, viszont a legnagyobb bajom, hogy a prog addig működik jól amíg bekéri az osztandót, utána vár.. az osztót csuszással lehet csak beadni neki, nemértem... onnan kezdvejól számol. nemtudom jól elmagyarázni tudnád esetleg futtatni, megnézni?
Gyuri16
senior tag
gyorsan neztem csak ra, nem vettem eszre a masik hibat. szoval a misztikus scanf..
itt jobban le van irva mint en tudnam:
[link]
roviden: ide nem kell a \n, mert az azt okozza, hogy addig olvas be jeleket stdinrol amig whitespace jeleket kap (az ujsor is az). egy ilyen scanf utan ugyan a \n jel ottmarad a bemeneten, de az itt nem baj, mert a kovetkezo beolvasas is float, ami atugorja ezt. ha chart olvasnal be utana, akkor az mar a \n-t kapna meg. ilyenkor nem art a stdinrol beolvasni mindent az ujsorig.
ajanlom megnezni a faq tobbi ide vonatkozo kerdeset is itt: [link] kulonosen a 12.20asat (miert ne hasznaljunk scanf-et felhasznalotol valo bemenetre)
Nem vagyok egoista, csak uborkagyalu!
Sloane
csendes tag
Nagyon köszönöm, átnézem ezeket, aztán küzdök tovább...muszáj tapasztalatot gyüjteni!
Geri9159
tag
Sziasztok tudnátok segíteni mert nem jövök rá mi lehet a hiba.
Van egy .txt fájl aminek a tartalma így néz ki:
Kiss Gyula
12a 11 13 12 13 12 13
Nagy Judit
12b 12 11 12 22 13 21
C-be írtam egy programot ami vissza olvassa a fájl tartalmát ami működik csak duplán írja ki a szöveges fájl tartalmát.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100
struct egydiak{
char nev[N];
char osztaly[N];
int szovegszerk;
int prezentacio;
int weblap;
int tablazatkezel;
int adatbaziskezel;
int informatika_ism_konyvtar_internet;
}diakok[N];
FILE *fbe;
int i;
int diakokszam;
char osztbeker;
main(){
fbe=fopen("Informatika_kozepszintu_erettsegi.txt", "r");
if(fbe==NULL){
printf("Hiba a file megnyitasaban\n");
getch();
exit(0);
}else{
while(!feof(fbe)){
fgets(diakok[diakokszam].nev,99,fbe);
fgets(diakok[diakokszam].osztaly,4,fbe);
fscanf(fbe,"%d %d %d %d %d %d",&diakok[diakokszam].szovegszerk,&diakok[diakokszam].prezentacio,&diakok[diakokszam].weblap,&diakok[diakokszam].tablazatkezel,&diakok[diakokszam].adatbaziskezel,&diakok[diakokszam].informatika_ism_konyvtar_internet);
printf("Nev: %s\n",diakok[diakokszam].nev);
printf("Osztaly: %s\n",diakok[diakokszam].osztaly);
printf("Szovegszerkesztes: %d\n",diakok[diakokszam].szovegszerk);
printf("Prezentacio es grafika: %d\n",diakok[diakokszam].prezentacio);
printf("Weblapkészítés: %d\n",diakok[diakokszam].weblap);
printf("Tablazatkezeles: %d\n",diakok[diakokszam].tablazatkezel);
printf("Adatbazis-kezeles: %d\n",diakok[diakokszam].adatbaziskezel);
printf("Informatikai alapismeretek, Konyvtarismeret es internethasznalat: %d\n",diakok[diakokszam].informatika_ism_konyvtar_internet);
}
}
fclose(fbe);
getch();
}
Nem jövök rá hogy miért írja ki duplán. Ha valaki tud segítsen.
Előre is köszönöm
Geri9159
[ Szerkesztve ]
Gyuri16
senior tag
nem csak duplan irja ki, hanem rosszul. a baj az, hogy a fscanf hivas utan ottmarad a bemeneten egy ujsor karakter, amit a ciklus kovetkezo iteraciojaban a fgets megeszik, es csak azzal ter vissza. innen pedig az egesz eltolodik. en azt ajanlom egesz fajlt soronkent olvasd be, akkor nem lesz ilyen baj. a fscanf-s reszt helyettesitheted pl igy:
char tmp[30];
fgets(tmp, 30, fbe);
sscanf(tmp,"%d %d %d %d %d %d",&diakok[diakokszam].szovegszerk,&diakok[diakokszam].prezentacio,&diakok[diakokszam].weblap,&diakok[diakokszam].tablazatkezel,&diakok[diakokszam].adatbaziskezel,&diakok[diakokszam].informatika_ism_konyvtar_internet);
tovabba a fgets beolvassa az ujsor karaktert is, ezert a nev valtozodban az is ott lesz (feleslegesen) a vegen. ezert van a kimenetedben is egy sorkihagyas a nev alatt. ugyanez igaz az osztaly valtozodra is, de ott mivel limitalod a beolvasast 4 karakterre nem fer bele az ujsor, igy az jol mukodik, ha pontosan 3 karakter lesz a bemenet.
mod: amit fentebb lineltem faq, ott ez is megvan valaszolva: [link]
sok mas gyakori hibara is kiternek benne, erdemes atnezni
[ Szerkesztve ]
Nem vagyok egoista, csak uborkagyalu!
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!