[c++] convert string to 2 ints

Pagina: 1
Acties:

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
Hi, heb het volgende:

Heb een char *temp die een tijd bevat in de format: hh:mm (24 uurs tijd)
en die wil ik omzetten in 1 integer uiteindelijk door de uren met 60 te vermenigvuldigen en daarna de minuten erbij op te tellen.

Geprobeerd heb ik:

strtok(temp,":") -> had als nadeel dat ik alleen eerste deel overhoud

Gevonden met Google was dingen over Epoch :?
Maar die dingen zijn over het algemeen niet wat ik zoek.

Andere dingen zijn strptime() -> maar die kon ik bijvoorbeeld niet in msdn terug vinden....

Dit zal vermoedelijk heel makkelijk kunnen maar zie het gewoon ff niet

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


Verwijderd

code:
1
2
temp[2] = 0;
int result = 60 * atoi(temp) + atoi(temp + 3);


is een optie hoewel het meer C dan C++ is...

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
thnx die werkt... en doet al wat het moet doen.....

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Snap je nu ook wat je code doet?

Professionele website nodig?


Verwijderd

Omdat ik zelf C++ probeer te leren als oefening hier ook nog de C++ manier:
code:
1
2
3
4
5
  char c; // to eat the ":" in the time
  int hours, minutes;
  std::istringstream time(temp);
  time >> hours >> c >> minutes;
  int result = hours * 60 + minutes;

En curry684 heeft zeker gelijk: zorg dat je alle code die je niet zelf hebt geschreven minimaal geheel begrijpt voordat je het gebruikt. Dan zie je bijvoorbeeld dat mijn eerdere fragment veel minder robuust is dan het fragment hier: de eerste zal bijvoorbeeld niet werken als de tijd per ongeluk in het formaat H:mm is i.p.v. hh:mm en ook niet als er per ongeluk spaties in de temp string zitten... De C++ manier hierboven heeft daar allemaal geen last van: deze behandelt ook de tijd " 2 :15" op de juiste manier.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
In plaats van die tijdelijke variabele om die dubbele punt "op te eten" kun je eventueel ook de ignore-methode van het istream-object gebruiken. Is misschien wat netter omdat je dan geen variabele introduceert die je eigenlijk niet gebruikt. Jammer genoeg werkt dit niet in het algemene geval (wanneer je bijvoorbeeld een integer zou willen negeren).

Overigens vind ik dat je een variabele nooit "temp" moet noemen; geef 'm dan gewoon een zinnige naam! De enige uitzondering is misschien bij het omwisselen van elementen in een sorteeralgoritme, waar de tijdelijke variabele "echt heel erg tijdelijk" is (en je die constructie eigenlijk alleen gebruikt bij gebrek aan een post-assignment operator).

[ Voor 11% gewijzigd door Soultaker op 29-08-2003 01:22 ]


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
Ik heb wel eens iets soortgelijks gezien ja, maar wat ik niet snap is dat jullie zo'n probleem maken van die :

Ik heb het even getest en het werkt dus ook zonder Temp[2]=0 bijvoorbeeld.

De rest is wel logisch.. denk ik...
Temp+3 dat dat de cursor naar de 3e plaats zet... tja dat moet je gewoon weten denk ik.

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
cursor ? :)

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.


Verwijderd

Die naam "temp" heeft de topicstarter verzonnen. Om verwarring te voorkomen heb ik die maar overgenomen. B.t.w: temp is een pointer en temp + 3 is een pointer die drie geheugenplaatsen verder verwijst dan temp zelf. temp[2] = 0; zorgt ervoor dat zowel temp als temp + 3 nu twee afzonderlijke null-terminated char arrays zijn geworden. Dat het ook werkt zonder temp[2] = 0; komt omdat de functie atoi() stopt met de conversie als er een ongeldig karakter wordt gelezen (":" dus in dit geval).
Pagina: 1