Avatar billede tosssen Nybegynder
22. juli 2003 - 14:11 Der er 19 kommentarer og
1 løsning

Parse streng til int

I Java kan man parse strenge-input til en int med metoden Integer.parseInt(String arg).
Hvad er den tilsvarende løsning på problemet i ISO/ANSI C++?
Avatar billede arne_v Ekspert
22. juli 2003 - 14:13 #1
Der er flere muligheder.

Den simpleste er nok:

char s[] = "123";
int v;
v = atoi(s);
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:15 #2
ok - er der så en tilsvarende exception-handling? (I Java er der jo NumberFormatException)
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:17 #3
hvad med Double.parseDouble(String arg)? Har den en tilsvarende i ISO/ANSI C++?
Avatar billede arne_v Ekspert
22. juli 2003 - 14:17 #4
#include <stdlib.h>

Virker i både C og C++.

En af grundene til at man kunne foretrække alternativer er at bogstaver får
den til at returnere 0.

Og det er svært at se forskel på 0 og rigtigt 0.
Avatar billede arne_v Ekspert
22. juli 2003 - 14:18 #5
For et bedre alternativ strtol. Der kan man teste om man har fundet
et tal.
Avatar billede arne_v Ekspert
22. juli 2003 - 14:19 #6
Floating point: atof (men jeg er ikke helt sikker på at atof
er standard).
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:19 #7
jeg går ud fra at cstdlib kan bruges i stedet for stdlib.h?
Avatar billede arne_v Ekspert
22. juli 2003 - 14:20 #8
Eller som alternativ strtod.
Avatar billede arne_v Ekspert
22. juli 2003 - 14:20 #9
Ja.
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:21 #10
Nå, nu begynder det at dæmre - har glemt en del c++ pga. at vi anvender java på studiet... Du får pointene - tak for hjælpen!
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:22 #11
Jeg har lige fundet en reference og kan se at begge dine forslag er ISO/ANSI C++, så det er jo helt perfekt!
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:26 #12
Lige en sidste ting: Hvor skal jeg lede for at finde info om de alternativer der er til ovennævnte funktioner? Jeg kunne da godt tænke mig at lave en helt fejlsikker håndtering af numerisk input ;-)
Avatar billede arne_v Ekspert
22. juli 2003 - 14:27 #13
Her er et eksempel:

#include <stdlib.h>
#include <stdio.h>

void testi(char *s)
{
  int v;
  char *ep;
  v = atoi(s);
  printf("%s = %d\n",s,v);
  v = strtol(s, &ep, 10);
  if(ep > s)
  {
      printf("%s = %d\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}


void testfp(char *s)
{
  double v;
  char *ep;
  v = atof(s);
  printf("%s = %f\n",s,v);
  v = strtod(s, &ep);
  if(ep > s)
  {
      printf("%s = %f\n",s,v);
  }
  else
  {
      printf("%s not number\n",s);
  }
}


int main()
{
  testi("123");
  testi("abc");
  testfp("123.456");
  testfp("abc.def");
}

og output viser det med bogstaver:

123 = 123
123 = 123
abc = 0
abc not number
123.456 = 123.456000
123.456 = 123.456000
abc.def = 0.000000
abc.def not number
Avatar billede arne_v Ekspert
22. juli 2003 - 14:28 #14
Kig lidt på ovenstående eksempel.

Eller find en referance enten på nettet eller i din compilers
dokumentation.
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:44 #15
Fandt dette på nettet om strtod:

Because 0 is returned on error and is also a valid return on success, an application wishing to check for error situations should set errno to 0, then call strtod(), then check errno.

Jeg forstår ikke helt hvad det er du gør når du sammenligner pointerne s og ep. Kan enten du prøve at forklare det eller hvordan man bruger det info jeg lige har fundet på nettet?
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:50 #16
Fandt noget mere:

Upon successful completion, these functions shall return the converted value. If no conversion could be performed, 0 shall be returned, and errno may be set to [EINVAL].

If the correct value is outside the range of representable values, ±HUGE_VAL, ±HUGE_VALF, or ±HUGE_VALL shall be returned (according to the sign of the value), and errno shall be set to [ERANGE].

If the correct value would cause an underflow, a value whose magnitude is no greater than the smallest normalized positive number in the return type shall be returned and errno set to [ERANGE].
Avatar billede arne_v Ekspert
22. juli 2003 - 14:51 #17
http://www.cplusplus.com/ref/cstdlib/strtod.html

Det vigtige er:

endptr
Address of a pointer. This is filled by the function with the address where scan has ended.

hvis ikke ep > s så er scan sluttet inden den er begyndt og derfor
indeholder s ikke et tal.
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:51 #18
Jeg tror godt jeg kan komme videre her fra! Mange tak for hjælpen og brug nu ikke alle pointene på en gang ;-)
Avatar billede arne_v Ekspert
22. juli 2003 - 14:53 #19
Ja det er så også nogle fejl-muligheder.

Og hvis du vil teste for dem skal du teste på errno.

Men i de fleste praktiske tilfælde er de ikke nær så relevante
som garbage i input.
Avatar billede tosssen Nybegynder
22. juli 2003 - 14:54 #20
Så vidt jeg kan se bliver errno da sat til EINVAL hvis det er en garbage-streng man forsøger at parse
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester