programparaméterek feldolgozása, és reguláris adatbevitel

 ( nevergone | 2004. május 18., kedd - 19:27 )

programparaméterek feldolgozása, és reguláris adatbevitel

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Sziasztok...

Két gondom lenne a programozással Linux (Unix) rendszereken, C nyelven.
Az egyik a programnak átadott parancssori paraméterek feldolgozása. Azaz pl. ez a három parancs ugyanazt eredményezi: "ls -la" "ls -al" "ls -l -a" "ls -a -l"

Hogyan lehetne megoldani, hogy ne nekem kelljen szőrözni a paraméterek sorrendjével? Azaz ne nekem kelljen végigszenvedni a lehetséges variációk sorrendjét...

A másik kérdés: a programban szeretnék olyan adatbevitelt alkalmazni, ahol lehetőség van reguláris bevitelre, azaz "grep" -szerűen lehessen megadni az adatokat. Lehetséges erre valami könyvtári függvényt alkalmazni, vagy nekem kell a programban feldolgoznom és kiértékelnem a kifejezést...?

Bocs a pongyola fogalmazásért.

[quote:ff445824f8="nevergone"]
Az egyik a programnak átadott parancssori paraméterek feldolgozása. Azaz pl. ez a három parancs ugyanazt eredményezi: "ls -la" "ls -al" "ls -l -a" "ls -a -l"
[/quote:ff445824f8]
reszlet az ls.c forrasabol:
[quote:ff445824f8="Kód"]
while ((c = getopt_long (argc, argv,
"abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
long_options, NULL)) != -1)
{
switch (c)
{
case 0:
break;

case 'a':
all_files = 1;
really_all_files = 1;
break;
...
[/quote:ff445824f8]
Semmi tobbet nem tudok elmondani, kerem kapcsolja ki!

kezdoknek:
legyen deb-src kezdetu sorod a /etc/apt/sources.list-ben, es akkor mukodik a(userkent is)
apt-get source packagename
es maris lehet bongeszgetni a forrast.;-)

Hello!
[quote:f24dfd80cb]Semmi tobbet nem tudok elmondani, kerem kapcsolja ki! [/quote:f24dfd80cb]
Meglehetősen szomorú, hogy a fentebb említett lehetőség csak egy a kismillió közül de mindegyiken kb. 5 percet kellett volna elmerengeni. :(
...és ha annyi nem elég, vagy fárasztó, akkor inkább tényleg kapcsolja ki...:x
vagy menjen el kormányzati, államigazgatási munkahelyre programozónak...:twisted:

Bocs, de kijött...:oops:

Row

ls.c nagyon "tanulsagos" ... :), dehat ott van minden a kezedben, argc, *argv, akkor meg szepen [code:1:5a74ac7f73]for(int i=0;i<=argc;i++){itt meg argv[i]-t olvasod ahogy akarod, switchelsz, vagy ami jol esik...[/code:1:5a74ac7f73]

grep szeruen? ez alatt mit ertesz? regularis bevitelre mindig van lehetoseg, mivel a kifejezest nem te programod kapja meg, hanem a shelled, a programodnak csak azt kell ertelmeznie, amit kap mar ertelmezve a shelltol.
vagy nem erre gondoltal?

[quote:871713f0b4="Bali"]ls.c nagyon "tanulsagos" ... :), dehat ott van minden a kezedben, argc, *argv, akkor meg szepen [code:1:871713f0b4]for(int i=0;i<=argc;i++){itt meg argv[i]-t olvasod ahogy akarod, switchelsz, vagy ami jol esik...[/code:1:871713f0b4]

grep szeruen? ez alatt mit ertesz? regularis bevitelre mindig van lehetoseg, mivel a kifejezest nem te programod kapja meg, hanem a shelled, a programodnak csak azt kell ertelmeznie, amit kap mar ertelmezve a shelltol.
vagy nem erre gondoltal?[/quote:871713f0b4]

Pl. a programban nem csak egyszerű szövegre lehessen keresni, hanem reguláris kifejezésre. És mivel ez egy C program, nemhinném hogy a shell kiértékelné a bevitelt.

jo mosmar ertelek, szoval a program futasa alatt akarod, mert ezt nem mondtad, mivel inditaskor is lehet inputot es paramtert is megadni, es ott viszont a shell ertelmezi.

paraméterfeldolgozás: man getopt - és akkor nem csak L* alatt működik a kódod, hanem majdnem minden UNIX-like rendszeren.
"grep"-szerű: man regcomp regexec regerror regfree - egyébként valamelyik utóbbi Linuxvilágban asszem pont volt erről egy cikkecske.
És bocs, ha paraméterként átadok egy regexp-et, azt bizony ha nem takarom el a shell elől, akkor igenis megpróbálja kiértékelni - igaz nem regexp-ként, hanem globbing-ként (joker-ként), de ez a pofáraesésre már bőven elég.

$ program ab*

ez shellnek is érthető minta, meg regexp-nek is, de persze egész mást jelent.

Zahy

ja amugy igy hirtelen ugy probalnam megcsinalni amit akarsz, hogy ha a programod var egy stringet keresesre, akkor ahogy rendezve van a forras, ahonnan kiolvas (file, vagy tomb vagy akarmi..) mindegyik elejet hasonlitjsa ossze a megadott stringgel, vagy ha nincs igy rendezve a forras, akkor marad file eseten az agybafobe pocizionalas talan? nemtom
maskepp csak nagyon proli megoldasok jutnak eszembe... vagyis hogy az input stringed karakterenkent vizsgalja es igy vmi fat kialakitani es pl a "." karakter vmifele "dontcare" elagazast jelentene. de felek nem ez a jo megoldas.
remelem adtam vmi otletet azert :)

Első körben apt-get install glibc-doc aztán info libc, aztán van ott egy olyan, hogy `* Program Arguments:: Parsing your program's command-line arguments.', és ott van minden földi jó, getopt, argp, suboptions, mindezek példakóddal.

ahogy kivettem nevergone 2. magyarazatat, az a baj, hogy nem commandline arghumentsre van szukseg (es az abban levo reuglaris kifejezeseket ertelmezi a shell...), hanem a programjaval akarja megetetni futas alatt mint bekert erteket.

[quote:6cbabe4d53="Bali"]ahogy kivettem nevergone 2. magyarazatat, az a baj, hogy nem commandline arghumentsre van szukseg (es az abban levo reuglaris kifejezeseket ertelmezi a shell...), hanem a programjaval akarja megetetni futas alatt mint bekert erteket.[/quote:6cbabe4d53]
Ahogy én kivettem az első hozzászólásából, erre is-arra is szüksége lenne... Aztán lehet, h rosszul vettem ki belőle.. (;

[quote:258a9df68b="sz"][quote:258a9df68b="Bali"]ahogy kivettem nevergone 2. magyarazatat, az a baj, hogy nem commandline arghumentsre van szukseg (es az abban levo reuglaris kifejezeseket ertelmezi a shell...), hanem a programjaval akarja megetetni futas alatt mint bekert erteket.[/quote:258a9df68b]
Ahogy én kivettem az első hozzászólásából, erre is-arra is szüksége lenne... Aztán lehet, h rosszul vettem ki belőle.. (;[/quote:258a9df68b]

Jól vetted ki, a két kérdés független egymástól. Az egyik arra vonatkozik, hogy a programmal helyesen olvashassam be a parancssorban megadott paramétereket, még akkor is, ha azok meglehetöst bonyolultak (kapcsolók, kapcsoló + állománynév, stb.). A másik kérdés pedig arra vonatkozik, ha a program futása közben szeretnék adatokat regulárisan feldolgozni. Mondjuk van egy adatszerkezetem, minden eleme egy szó, a felhasználó futás közben beír egy reguláris kifejezést, nekem pedig ki kell válogatnom azokat az elemeket, melyek illeszkednek a kifejezéshez.

Szal, két külön, egymástól független kérdésről lenne szó.

Köszönöm az eddigi válaszokat, de ha még van ötletetek, jöhet... :)