[C] hulp bij sscanf.

Pagina: 1
Acties:

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
dit is wat ik nu doe (in pseudocode)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#3 voorbeeld strings als invoer
# 1:01PM  up 1 day, 20:15, 1 user, load averages: 0.06, 0.03, 0.01
#12:55PM  up 2:50, 3 users, load averages:0.05, 0.11 0.14
# 1:21PM  up 19 mins, 1 user, load averages: 0.00, 0.00, 0.00

char * uptime(char * begin)

#sla de tijdinfo over
begin = begin+9;

cahr * eind;
eind = strstr(begin,"user");

#zoek het begin van "user" op
#zet daar een \0
*eind = '\0';

#ga nu na waar het laatste voorkomen van , is in de string
eind = strrchr(begin,',');

#vervang deze , door \0
*eind = '\0';

#begin bevat nu:
#of: up 1 day, 20:15\0
#of: up 2:50\0
#of: up 19 mins\0

volgens kan het in 1 sscanf maar ik kom er niet uit !

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Wat lukt je dan niet?
Weet je niet hoe je sscanf gebruikt, of werkt je sscanf versie niet?
In het laatste geval kan je beter je format string nog even plaatsen.

In het eerste geval: in je format string kan je met zo'n % teken aangeven dat je op die plaats een matchende waarde in een variable wilt hebben (%f -> floats, %d decimale getallen bijvoorbeeld).
Aan sscanf moet je wel een pointer naar de variablen opgeven, want anders kan sscanf de waarde er niet in plaatsen.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
ik kan er geen regular expression voor bedenken, ik heb hier een kernighan Ritchie C handboek, dus als ik de regexp heb moet de rest hopelijk wel lukken.

alhoewel het in het boek ook niet duidelijk staat.

samengevat:
ik kan geen juiste regexp vinden/bekenken
waarschijnlijk kan ik hem ook niet naar een sscanf geldige regext vertalen.

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:26

Creepy

Tactical Espionage Splatterer

code:
1
2
3
4
5
6
fp=fopen("/proc/meminfo","r");
fgets(buffer,sizeof(buffer)-1,fp);// sla eerste regel over
fgets(buffer,sizeof(buffer)-1,fp);

//*s zorgt ervoor dat het eerste  string type (=mem:) overgeslagen wordt.
sscanf(buffer,"%*s %lu %lu",&memtotal,&memused);

Code parst deze info door:
code:
1
2
      total:    used:    free:  shared: buffers:  cached:
Mem:  261525504 186761216 74764288    0  4067328 101326848

memtotal en memused zijn unsigned longs. En daar komt dus mooi als een unsigned integer de mem usage in. (uit LCDInf Linux)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
Op zondag 26 mei 2002 19:18 schreef Creepy het volgende:
code:
1
2
3
4
5
6
fp=fopen("/proc/meminfo","r");
fgets(buffer,sizeof(buffer)-1,fp);// sla eerste regel over
fgets(buffer,sizeof(buffer)-1,fp);

//*s zorgt ervoor dat het eerste  string type (=mem:) overgeslagen wordt.
sscanf(buffer,"%*s %lu %lu",&memtotal,&memused);

Code parst deze info door:
code:
1
2
      total:    used:    free:  shared: buffers:  cached:
Mem:  261525504 186761216 74764288    0  4067328 101326848

memtotal en memused zijn unsigned longs. En daar komt dus mooi als een unsigned integer de mem usage in. (uit LCDInf Linux)
thanks die voor mem heb ik nu alvast maar daar was ik zelf ook uitgekomen ! 1 string overslaan en de next 2 "getallen"pakken..

maar die uptime ?? (ik heb de pseudocode van hievboven al werkend in mijn server.c)

de eerste string overslaan en dan alles pakken until "user" dan van achter af alles eraf knippen incl de eerste komma vanaf acteren... dan hebbie een uptime.

niemand kan dit in 1 of 2 scanfjes ?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op maandag 27 mei 2002 07:05 schreef xychix het volgende:

[..]
niemand kan dit in 1 of 2 scanfjes ?
Vast wel, maar scanf is nou niet bepaald een lekkere funktie. Beter is om de regel te parsen met strtok().

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
Op maandag 27 mei 2002 07:36 schreef Sponz het volgende:

[..]

Vast wel, maar scanf is nou niet bepaald een lekkere funktie. Beter is om de regel te parsen met strtok().
heb ik ook nog even naar gekeken, kun jij een voorbeeld geven dat alle 3 voorbeeld strings goeb kan behandelen ?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:26

Creepy

Tactical Espionage Splatterer

1:01PM up 1 day, 20:15, 1 user, load averages: 0.06, 0.03, 0.01
12:55PM up 2:50, 3 users, load averages:0.05, 0.11 0.14
1:21PM up 19 mins, 1 user, load averages: 0.00, 0.00, 0.00
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (sscanf(buffer,"%*s %*s %s %i",&buffer1, &intbuffer) == 4)
{
  // tweede situatie is gelukt.. 4de param is nl. een int (de 3 dan 3 users) 
  // buffer1 is nu "2:50,"
}
else 
{
   if (sscanf(buffer,"%*s %*s %i %s", &intbuffer, &buffer2) == 4)
   {
    // in het 1ste is intbuffer nu 1 en buffer2 "day,"
    // in het 3de geval is intbuffer nu 19 en buffer2 "mins,"
   }
}

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
Aangezien je uit een bestand leest, zou je ook fscanf(...) kunnen gebruiken. Scheelt je een buffer ..

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
Op maandag 27 mei 2002 09:28 schreef Creepy het volgende:

[..]
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (sscanf(buffer,"%*s %*s %s %i",&buffer1, &intbuffer) == 4)
{
  // tweede situatie is gelukt.. 4de param is nl. een int (de 3 dan 3 users) 
  // buffer1 is nu "2:50,"
}
else 
{
   if (sscanf(buffer,"%*s %*s %i %s", &intbuffer, &buffer2) == 4)
   {
    // in het 1ste is intbuffer nu 1 en buffer2 "day,"
    // in het 3de geval is intbuffer nu 19 en buffer2 "mins,"
   }
}
gaat deze niet op zijn bek bij:
code:
1
 1:21PM  up 1 day, 19 mins, 1 user, load averages: 0.00, 0.00, 0.00

of betaat deze uitvoer niet ??? en nu heb je nog aardig wat code, ik houd dan mijn eigen methoe wel aan (ook maar 6 regels code oid.)

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:26

Creepy

Tactical Espionage Splatterer

Dna gaat ie op z'n bek ja, dus zul je weer een if met een sscanf moeten toevoegen. Een andere manier op dit te parsen is naar mijn idee wel beter ja...

Maar er is toch wel een andere manier om de uptime te bepalen? het uptime commando geeft de uptime voor een mens makkelijk leesbaar aan, niet voor een machine.

In Linux heb je /proc/uptime die 2 getallen teruggeeft, die je dan weer met een paar functies om moet zetten naar iets wat door een mens goed te lezen is. Ik neem aan dat er voor BSD ook wel een paar call's zijn die op ongeveer dezelfde manier de uptime geven als /proc/uptime in Linux. Misschien de source van uptime op BSD eens bekijken?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • igmar
  • Registratie: April 2000
  • Laatst online: 23-08 16:57

igmar

ISO20022

Vast wel, maar scanf is nou niet bepaald een lekkere funktie. Beter is om de regel te parsen met strtok().
strtok() is zo ongeveer de lelijkste functie die er te bedenken is.

Uit de manpage :

[quote]
BUGS:
Never use this function....

[quote]

Beter is om strpbrk() te gebruiken. Iets meer werk kwa implementatie, maar iets netter. Het enige nadeel is dat de functie geen ANSI-C is, maar alleen POSIX.

  • xychix
  • Registratie: September 2000
  • Laatst online: 03-12-2025

xychix

FreeBSD Rules !

Topicstarter
ik laat het gewoon bij:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char * test(char * uptime,char * uitvoer)
{
  char * begin;
  char * eind;
  begin = uptime;
  begin = begin + 9;

  eind = strstr(begin,"user");
  *eind=0;
  eind = strrchr(begin,',');
  *eind='\0';

  strcpy(uitvoer,begin);
  return(uitvoer);
}

Ik gebruik nu popen() om de uitvoer van het commando "uptime" uit te lezen. maar deze geeft de uptime in een mooi leesbaar formaat. Weten jullie niet een manier om de uptime in 1 eenheid (bv secondes) in een long / int of whatever in mijn c proggie te krijgen ??

ik heb al gegoogled en uit de broncode van uptime.c (google) word ik ook niet veel wijzer.

er schijnt iets met een "struct rwhod" te zijn.
[illegalle modus]
thanks all.
[/illegalle modus]

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad

Pagina: 1