Hirdetés

2024. május 1., szerda

Gyorskeresés

Hozzászólások

(#1101) Benmartin válasza Sk8erPeter (#1100) üzenetére


Benmartin
senior tag

Elég általános kérdéseket teszel fel: "Hogyan születik meg a javított kimeneti fájl?" Hát úgy, hogy létrehozod a fájlt, erre mit lehet mondani? :)

1.) fgets
2.) Egyébként én úgy csinálnám, hogy magát a fájlneveket is kigyűjteném egy fájlba és abból olvasnám be, majd nyitnám meg a fájlokat.
3.) fopen("javitott.txt","w")

(#1102) Benmartin válasza Benmartin (#1101) üzenetére


Benmartin
senior tag

De megírtam, hogy ne csak dumáljak itt:

#include <stdio.h>
#define MAX_FAJLNEV_HOSSZ 100
FILE * filelist, * file;
char name[MAX_FAJLNEV_HOSSZ+1], * block;
unsigned int h;
int main()
{
filelist = fopen("filelist.txt","r");
while(!feof(filelist))
{
fscanf(filelist,"%s",name);
file = fopen(name,"r");
fseek (file,0,SEEK_END);
h = ftell(file);
rewind(file);
block = (char *) malloc(h);
fread(block,1,h,file);
block += 4;
fclose(file);
fopen(strcat(name,"_jav.txt"),"w");
fwrite(block,1,h-4,file);
fclose(file);
}
fclose(filelist);
return 0;
}

(#1103) doc válasza Sk8erPeter (#1100) üzenetére


doc
nagyúr

ezt kimondottan C-ben akarod megirni, vagy csak a megoldas a fontos?
Linux alatt ez igy nez ki:

cat *txt | cut -c 5-

vagy ha kulon txt-kbe kell a vegeredmeny is:

for i in *txt; do cat $i | cut -c 5- >vagott-$i ; done

[ Szerkesztve ]

(#1104) Jester01 válasza Benmartin (#1102) üzenetére


Jester01
veterán

Ajjjaj ilyen rossz példával ne kábítsuk szegény tanulókat :P
Hirtelen ennyi:

1. te nem a sorok elejéről szedted le az első 4 karaktert
2. az fscanf visszatérési értékét célszerű ellenőrizni, nem pedig a feof-ot
3. %s formátummal nem olvasunk fájlneveket (sem) mert megáll a szóközöknél
4. az fscanf-ben nincs hossz limit
5. teljesen felesleges betölteni a memóriába a fájlt
6. strcat-hoz hiányzik a megfelelő #include
7. malloc-hoz hiányzik a megfelelő #include
8. a malloc void*-ot ad vissza, csúnyán néznek azokra akik ezt cast-olják
9. a lefoglalt memóriát nem szabadítod fel
10. a változók globálisak nem lokálisak
11. az ftell nem unsigned int-et ad vissza
12. hibakezelés teljes hiánya

Jester

(#1105) Benmartin válasza Jester01 (#1104) üzenetére


Benmartin
senior tag

1.) Tényleg elnéztem.
2.) Meglehet, gyakorlatban azonban működik.
3.) Jó, hát általában nem teszünk szóközt a fájlokba. :)
4.) Azért van a MAX_FAJLNEV_HOSSZ.
5.) Több megoldás is létezik.
6.-7.) ANSI C fordítónak nem is kell.
8.) Csúnyán néznek de működik, mondjuk akár ki is lehet venni.
9.) Ez jogos.
10.) Ebbe fölösleges belekötni.
11.) long-ot, de ebből nem igen lesz probléma.
12.) Nem is akartam hibakezelést írni. (gondolom magának írja)

(#1106) Jester01 válasza Benmartin (#1105) üzenetére


Jester01
veterán

Azért kötözködtem, mert tanuláshoz rossz példa.

2. Izé, kipróbáltad? Mert nem működik, mivel a feof csak azután lesz igaz, hogy túlmész a fájl végén. Tehát előfordulhat, hogy eggyel többször fut a ciklusod és az utolsó alkalommal ki tudja milyen adatra. Ehhez csak az kell, hogy az utolsó sor végén is legyen egy soremelés (márpedig ez normális dolog). Egyébként is pl. %d esetén vagy bonyolultabb formátumstringnél abból tudod, hogy sikerült-e beolvasni valamit. ellenkező esetben könnyen végtelen ciklus lehet (ugyanis olyankor a fscanf nem eszi meg a hibás adatot, de feof sem lesz)
3. sajnos de. sőt, még ékezeteket is. sokat szívok ezekkel én is a munkám során, főleg linux-windows közötti másolgatás nagy élmény (meg a kalapos vs. rendes ő/ű)
4. az azért van, hogy annyit kezel a programod, addig ok. de sehol nem biztosítod, hogy ne is legyen több. Az fscanf jelen formájában vidáman megesz többet is és szép buffer overflow lesz belőle. Ezt is jobb idejekorán megtanulni.
5. igen, és ez a rossz. már miért is ne lehetne egy 120GB-os fájlt feldolgozni csak azért mert nincs 120GB memóriám.
6-7. már hogyne kellene. Amelyik függvénynek nincs prototípusa, azt alapból int visszatérési értékkel feltételezi a fordító. Márpedig sem a malloc sem pedig az strcat nem int-tel tér vissza. És ha az int véletlen nem binárisan kompatibilis a void* illetve a char* típusokkal (pl 64 bites rendszer esetén) akkor az instant segfault.
10. szerintem nem fölösleges, jobb ha az újonc azt látja hogy a változókat a lehető legszűkebb körben deklaráljuk
11. azt te honnan tudod? És ha 5GB-os fájlra akarom futtatni? Vagy 128kB-osra 16 bites rendszeren?
12. ja és akkor nem kell. pl ha egy fájl (vagy sor) véletlen nincs 4 karakter akkor a program összeomlása az rendben van?

Jester

(#1107) Sk8erPeter válasza Benmartin (#1102) üzenetére


Sk8erPeter
nagyúr

Hali!
Köszi, hogy megírtad, de ez a program igen érdekes dolgokat csinál :D
A végeredmény az lesz, hogy MINDEN karakter után tesz egy szóközt. Egy fájlnál az összes sortörést is kitörölte (mondjuk nem értem, hogy ezt a másiknál miért nem tette).
Szemléltetésként ilyen lesz: [link] (itt épp php-kódokat másoltam ki pdf-ből, a sorszámozást ki akartam szedni, de ez a lényeg szempontjából tök mindegy)

Első lefordításnál ilyen hibát dob:
Visual Studio hiba

(már a while(!feof(filelist))-nél baja van)
Gondolom ezért is működik hibásan többek közt...
Aztán már le sem akar fordulni (létrehozni az exe-t), na mindegy, itt valami nagyon nem jó... :D
De azért thx. :R Egy javított verzió jól jönne... :B Előre is köszi!

Egyébként az "általános kérdéseket" hajnali fél 5 közeledtével fogalmaztam meg, így simán elképzelhető, hogy hülye kérdést tettem fel... :D

(#1103) doc: igazából mindkettő... de inkább gyakorolni szeretnék C-ben.
Nem használok Linuxot (egyelőre). Tehát elsősorban a C-s megoldás érdekelne.
Nyilván létezik egyébként olyan külső program (pl. Lupas Rename), amivel lazán megoldható, de abból nem lehet tanulni.

(#1104) Jester01: Esetleg tudnál egy javított változatot mutatni? :B

[ Szerkesztve ]

Sk8erPeter

(#1108) Benmartin válasza Sk8erPeter (#1107) üzenetére


Benmartin
senior tag

Mert különbözik a compilerünk, kipróbáltam mielőtt elküldtem neked. :)

(#1109) Benmartin válasza Jester01 (#1106) üzenetére


Benmartin
senior tag

2. Igen, kipróbáltam, bizonyára azért működött, mert nem volt '\n' a sor végén.
3. Oké, elfogadom, én nem szoktam, lehet azért írtam így.
4. Ez oké, de nem akartam bele hibakezelést írni, meg overflowokra figyelni, mert az kétszer ennyi kód, jelzésnek viszont ott volt, hogy mire képes.
5. Szerencsére itt nem voltak olyan méretek.
6-7. Ennek ellent kell mondjak rengeteg forráskódot küldtem már programozó versenyekre, ahol oline judge fordít ANSI C fordítóval, és nem igényelte a headereket, tulajdonképpen még az stdio.h-t sem.
10. Ez kérdéses, hogy mikor jó, mikor nem. Ebben a kódban semmi jelentősége nem volt, hogy globálisak a változók, egy másik példában lehet zavart okoz, egy másikban meg lehet, hogy pont úgy célszerű.
11. Valóban nem tudhatom, ha ilyen egyéni igények vannak, akkor lehet változtatásokat eszközölni.
12. Nincs rendben, de mondtam, hogy ennek kivédését nem állt szándékomban megírni.

(#1110) Sk8erPeter válasza Benmartin (#1109) üzenetére


Sk8erPeter
nagyúr

"mert nem volt '\n' a sor végén." De itt pont különálló, sortöréssel elválasztott sorokról van szó... bár lehet, hogy félreértelek... :F
Milyen fordítóval próbáltad? Nálam most Visual Studio 2003 van fent (azért használom ezt egyelőre, mert egyetemen is ezt használják szoftver laboron, nem akarom, hogy a fordító különbözősége miatt ott jelentkezzen egy hiba, amire nem számítok)
Most még mindig csak azt nem tudom, hogyan is kéne akkor megoldani a feladatot, na majd próbálkozom... :D
Azért kérdeztem egyébként, hogy mivel olvastassam be az adatokat, mert lehetne fscanf(), fgets(), fgetc(), fread(), és még ki tudja, hány függvénnyel is elvégeztetni ezt a feladatot (fgetc nyilván nem jó, meg fscanf sem, asszem annak is van valami szóköz-problémája).
Valami olyasmire gondoltam egyébként, hogy a progi a beolvasáskor az első /n-ig elmegy, eltárol egy sort valamilyen tömbbe vagy akármibe, és ezt úgy adja ki, hogy az 5. karaktertől lesz kiírva. Végül is ha tömbként kezelem, akkor elvileg a 0. elemtől kezdi, akkor elég lenne csak hozzáadni +4-et, hogy kezdje onnan, nem?

Sk8erPeter

(#1111) Jester01 válasza Benmartin (#1109) üzenetére


Jester01
veterán

5. Nem, de miért nem írod egyből jóra a programot? Azért, hogy extra pénzt kaszálj majd a professional verzióért ami nagyobb fájlokat is tud kezelni? Igen, lefordul, csak esetleg nem működik. Ráadásul a változó argumentumot használó függvényeknek ansi C szerint is kötelező a prototípus (pl. fscanf, printf) tehát általában az stdio.h bizony nem elhagyható. Az meg, hogy egy adott fordító esetleg mit eszik meg és mit nem, abszolút nem befolyásolja hogy mi van a szabványban vagy hogy mi a helyes.

6-7. melyik részének mondasz ellent? Annak, hogy int a prototípus nélküli függvények visszatérési értéke vagy annak, hogy pl. 64 biten piszkosul megszívod ha int-et használsz pointer helyett?

A többire pedig továbbra is csak azt tudom mondani, hogy lehetőleg ne ezt tanítsd egy kezdőnek.

Jester

(#1112) Jester01 válasza Sk8erPeter (#1107) üzenetére


Jester01
veterán

Szerintem a fájlod esetleg unicode lehet, az bekavarhat.

Jester

(#1113) Jester01 válasza Sk8erPeter (#1107) üzenetére


Jester01
veterán

Na itt az én verzióm, hogy ti is kötözködhessetek. Amit még én magamba belekötök, hogy lehetne még:
1. függvényekre szétszedni
2. a hosszú fájlneveket is (láncolt listával) kezelni
3. a tab-okat kezelni
4. locale beállításokat figyelembe venni
5. a kimenő fájlnevet szebben előállítani
6. parancssori argumentumokat kezelni

Jester

(#1114) cellpeti


cellpeti
veterán

Hogyan tudom kiiratni EOF értékét?Mert ilyen progit kéne megírnom,de .... :U

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1115) 426os


426os
őstag

Sziasztok.
Nem tudom ki hallott már a SE és Siemens telefonokon futtatható elfekről. Ezek apró kis programok, amelyek közvetlenül a hardverrel kommunikálnak, tehát elég gyorsan tudnak futni.
Viszont elég kevés elfnek nyilvános a forráskódja, és ennek hiányában nem igazán lehet belenyúlni, gondolok itt a lefordítást más nyelvre. Valamilyen szinten hex editorral ugye át lehet írni a karaktereket benne, de az nem az igazi. Ha jól tudom ezek C-ben vannak írva, tehát remélem jó helyen érdeklődök. Mégpedig afelől, hogy létezik-e olyan program, ami képes visszafejteni a kész, futtatható programot forráskódra. Mellékelek pár elfet (meg 1-2 forráskódot is, amihez nyilvános), csakhogy tudjátok miről beszélek.
[link]
Tudom, hogy az lenne a legegyszerűbb, hogy megkeresném a készítőket és elkérném a kódot, de ez sajnos nem járható út, mivel orosz barátaink nem szívesen adják azt ki.
Előre is köszönöm, ha valaki veszi a fáradtságot és foglalkozik velem.
üdv,
batonyo

.

(#1116) gygabor88 válasza cellpeti (#1114) üzenetére


gygabor88
tag

Ha csatolva van a stdio fejállomány, akkor printf("%d",EOF).

(#1117) gygabor88 válasza 426os (#1115) üzenetére


gygabor88
tag

Sosem foglalkoztam telefonokkal, de ha egy forráskódból futtatható binárist készítesz, akkor abból nem kapható vissza az eredeti forráskód. Az azonosítókat nem fordítják bele, így pl változóneveket, függvényneveket biztos nem lehet visszahozni. Ha van a telefonokra valami assembly szerű nyelv, akkor ilyen assembly utasításokra valószínűleg vissza lehet fejteni.

(#1118) cellpeti


cellpeti
veterán

Sziasztok!

Van nekem egy olyan feladatom,hogy a bemeneti szöveget úgy kell átmásolni a kimenetre,hogy a közben előforduló tabulátorkaraktereket \t,a visszaléptetés \b és a fordított törtvonal(backslash) karaktereket \\ karakterekkel helyettesíti.

Na én elkezdtem ezt a progit,de \\ helyet csak \ rak,ez valszeg a putchar miatt van,valszeg nem ezt kell használni. Megpróbáltam printf-vel is,de ott se jutottam előrébb. Lehet az egész rossz,ahogy elkezdtem,ezért ha valaki tud adjon tanácsot,megkösszönném.

a kód:

#include<stdio.h>

void main(void) {
int c;
c = getchar();
while(c!=EOF)
{
if (c=='\t') putchar('\\');
if (c=='\b') putchar('\\');
if (c=='/') putchar('\\');
else putchar(c);
c=getchar();
}
}

Esetleg egy darab if-ben nem lehetne megoldani a dolgot?

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1119) SLD válasza cellpeti (#1118) üzenetére


SLD
tag

Ez nem gond, a \ jellel aktiválod, az őt követő karakter "különleges értelmezését", ami legtöbbször egy formázó karakter. Szóval az első \-el aktiváltad ezt, így a második \ megjelent (itt saját maga esetén persze nem aktiválod vele, hanem tulajdonképpen deaktiválod, de ez már csak részletkérdés), ha ebből Neked két darabot kell kiíratnod, akkor \\\\ -t (4x) kell írnod.

Szerk: No persze, ha a putchar, csak egy char-t tud kezelni akkor az lehet gond lesz, mert két \ már két karakter, várunk egy C -s kollegát :)

A kódhoz, C++-os lévén, inkább nem szólok hozzá, de ha már kiírt egy \-t akkor nagy baj nem lehet.

[ Szerkesztve ]

(#1120) cellpeti válasza Elektromann (#1053) üzenetére


cellpeti
veterán

C-Free 4.0 :U

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1121) cellpeti


cellpeti
veterán

Valaki tudna ebben segíteni?

Tigris, tigris, csóvafény...

(#1122) PazsitZ válasza cellpeti (#1121) üzenetére


PazsitZ
addikt

Én így csinálnám:

#include<stdio.h>

int main() {
int c;
c = getchar();
while(c!=EOF)
{
if (c=='\t') printf("\\\\");
if (c=='\b') printf("\\\\");
if (c=='/') printf("\\\\");
else putchar(c);
c=getchar();
}
return 0;
}

De nem biztos, hogy a legjobb megoldás, régen c-ztem. :U

[ Szerkesztve ]

- http://pazsitz.hu -

(#1123) PazsitZ válasza PazsitZ (#1122) üzenetére


PazsitZ
addikt

vagy ha mindenképp a putchar('\\'); kell akkor 2db putchar-t raksz az if ágba.

- http://pazsitz.hu -

(#1124) cellpeti válasza PazsitZ (#1122) üzenetére


cellpeti
veterán

egészen addig vágom a dolgot,amíg nem jön oda a return 0,az mire kell oda?

Tigris, tigris, csóvafény...

(#1125) cousin333 válasza cellpeti (#1124) üzenetére


cousin333
addikt

Visszatérési érték, hogy minden frankón lefutott.

A "\" meg az escape karakter, aminek speciális jelentése van (pl. a "\n" jelzi a sortörést), éppen ezért nem lehet csak úgy magában leírni, hanem duplázni kell, jelezve, hogy kivételesen tényleg egy "\"-re vágysz.

[ Szerkesztve ]

"We spared no expense"

(#1126) cousin333 válasza cellpeti (#1118) üzenetére


cousin333
addikt

"Esetleg egy darab if-ben nem lehetne megoldani a dolgot?"

De, erre van a switch-case szerkezet. [link]. Mondjuk a példa nem lesz tőle egyszerűbb.

"We spared no expense"

(#1127) cellpeti válasza PazsitZ (#1122) üzenetére


cellpeti
veterán

jó a program! tényleg lefut! de nekem void main(void)-val kezdenem a progit és úgy viszont nem fut le. :O

Tigris, tigris, csóvafény...

(#1128) Lortech válasza cellpeti (#1127) üzenetére


Lortech
addikt

Akkor vedd ki a returnt, bár igazán kiváncsi lennék az okára, mert épp az int-es a jó.

amúgy meg 1 if:
if (c=='\t' || c=='\b' || c=='/') printf("\\\\");
else..

Thank you to god for making me an atheist

(#1129) cellpeti válasza Lortech (#1128) üzenetére


cellpeti
veterán

Az ok: Bauer Péter

Tigris, tigris, csóvafény...

(#1130) PazsitZ válasza cellpeti (#1127) üzenetére


PazsitZ
addikt

void main() esetén nem kell neki visszatérési érték.
Bár én is úgy tudom az a szabványos ha az int main() formát használja az ember.

[ Szerkesztve ]

- http://pazsitz.hu -

(#1131) Lortech válasza cellpeti (#1129) üzenetére


Lortech
addikt

Hát akkor legyen neki úgy az ő gyakján, de jó, ha tudod ettől függetlenül:
[link]

Thank you to god for making me an atheist

(#1132) cellpeti válasza Lortech (#1131) üzenetére


cellpeti
veterán

Sokan mondták,hogy ez így nem ok,de ha egyszer így kéri a tanár,mert különben bukta van,akkor sajnos csak ez marad. :O

Tigris, tigris, csóvafény...

(#1133) Sk8erPeter válasza Jester01 (#1113) üzenetére


Sk8erPeter
nagyúr

Bocsi, hogy csak most válaszolok, nem nagyon voltam gépközelben!
Köszönöm, hogy megírtad, ez nagyon faszán működik! :R:R
Pár rövid pluszkérdés: :B
1.) Ami érdekességet (számomra érdekes) felfedeztem, hogy ha sima Notepad-del, Unicode kódolással mentek egy fájlt, akkor nem működik a program, és egy 0 bájtos verziót készít el, míg az ANSI kódolásúakkal nincs probléma. Ez mitől van? :F
(Ha Notepad++-szal készítem el ugyanazt a fájlt, amiért a sima Notepad pampog, hogy elveszhetnek egyes karakterek, ha nem Unicode-ban mentem, akkor semmi para. Gondolom alapvetően a Notepad++ ANSI kódolással készíti el a fájlt, nem?)
2.) A "const int column" miért fontos, hogy const legyen?
3.) A "char infilename[MAX_FILENAME_LENGTH + 1];" sornál miért kell a +1?
4.) Ugyanígy ott van a plusz 1 a "char outfilename[MAX_FILENAME_LENGTH + 9]; /* a +8 a _jav.txt miatt */" sorban.
5.) A többin még gondolkozom... :B :D

Még egyszer köszönöm, hogy megírtad! :R

Sk8erPeter

(#1134) skylaner válasza Sk8erPeter (#1133) üzenetére


skylaner
senior tag

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

(#1135) Jester01 válasza Sk8erPeter (#1133) üzenetére


Jester01
veterán

1. azért mert unicode (akár utf8 akár utf16/ucs2) esetén nem 1 byte 1 karakter. Utf16 esetén továbbá sok 0 byte is előfordul ami C-ben sajnos a string végét jelzi.
2. nem fontos, de ha egyszer konstans, akkor miért ne
3-4. lásd a kollega válaszát fentebb
5. jó :)

Jester

(#1136) skylaner


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 dolgokat :)

Na 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 ]

(#1137) cellpeti


cellpeti
veterán

Sziasztok!

Nekem van egy feladatom,de nem teljesen értem.
Írjunk programot,ami a bemenetre adott szöveget úgy másoljuk át a kimenetre,hogy közben az egy vagy több szóközből álló karaktersorozatokat egyetlen szóközzel helyettesíti!

Mi a feladat végülis?

Tigris, tigris, csóvafény...

(#1138) skylaner válasza cellpeti (#1137) üzenetére


skylaner
senior tag

Valami ilyesmi szerintem.

*=szóköz
bemenet:dfsdfsdf*dfsdf***dfsdf********fdfd*fdsf****
kimenet: dfsdfsdf*dfsdf*dfsdf*fdfd*fdsf*

(#1139) cellpeti válasza skylaner (#1138) üzenetére


cellpeti
veterán

magyarul mindenhova csak 1 szóköz kerülhet? :U

Tigris, tigris, csóvafény...

(#1140) skylaner válasza cellpeti (#1139) üzenetére


skylaner
senior tag

Jaja, mást nem nagyon tudok elképzelni a szöveg alapján.

(#1141) Jester01 válasza skylaner (#1136) üzenetére


Jester01
veterán

Ránézésre jó. :K
MOD: eltekintve attól, hogy összevissza kevered a nyelveket (mmint a magyart meg az angolt) :P

[ Szerkesztve ]

Jester

(#1142) skylaner válasza Jester01 (#1141) üzenetére


skylaner
senior tag

Ok, kösz.
Tudom, hülye szokás :)

Szerk:
De most belegondolsz nem kell annyit írni:D
myTree /+2 kar sajatFa /+3 kar esetleg Fam, de ez még rosszabb mint az eredeti. :DDD

[ Szerkesztve ]

(#1143) cellpeti


cellpeti
veterán

Sziasztok!

Csillaggal már sikerült megírnom a programot,viszont szóközzel még nem igazán. :(
Arra gondoltam,hogy lehet az ASCII kódjával kéne próbálkozni. Tudja valaki a szóköz ASCII kódját? :U

Tigris, tigris, csóvafény...

(#1144) skylaner válasza cellpeti (#1143) üzenetére


skylaner
senior tag

Hát ha nem is tudjuk fejből a kis kínai barátunk Goog Lee mindent tud: [link]

Vagy: for(i=0;i<256;i++) printf("%d:%c\n",i,i);

Amúgy ha * megy akkor szóközzel is ugyanúgy mennie kéne.
char a[255];
int i=0;
gets(a);
for(i=0;i<a_hossza;i++) {
if(a[i]==' ') .........

(#1145) cellpeti válasza skylaner (#1144) üzenetére


cellpeti
veterán

a könyv elején van,nem hiszem,hogy ilyen bonyolult lenne a megoldás :U

Tigris, tigris, csóvafény...

(#1146) skylaner válasza cellpeti (#1145) üzenetére


skylaner
senior tag

É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 ]

(#1147) cellpeti válasza skylaner (#1146) üzenetére


cellpeti
veterán

mi az a gets? :U :O

[ Szerkesztve ]

Tigris, tigris, csóvafény...

(#1148) skylaner válasza cellpeti (#1147) üzenetére


skylaner
senior tag

Egy sort olvass be az inputról az Enter lenyomásáig. Az új sor karaktert '\n' nem olvassa be.

(#1149) cellpeti válasza skylaner (#1148) üzenetére


cellpeti
veterán

köszönöm!

Tigris, tigris, csóvafény...

(#1150) Jester01 válasza skylaner (#1148) üzenetére


Jester01
veterán

Viszont nincs benne hossz korlátozás ezért használata erősen ellenjavalt (buffer overrun). Helyette általában az fgets ajánlott, de vigyázat, az viszont eltárolja a sorvég jelet is. Jelen esetben azonban teljesen felesleges sorokat olvasni, mivel a feladat karakter-orientált.

Jester

Copyright © 2000-2024 PROHARDVER Informatikai Kft.