Avatar billede withli Nybegynder
11. marts 2004 - 13:34 Der er 15 kommentarer og
1 løsning

Streng behandling, identifikation af et tal i en streng

Hejsa der.

Jeg står og har en streng

std::string toValidate;

I den to validate smider jeg så et input i, vi kan jo sige at det ser sådan her ud

"Dette er test meddelelse <i>42</i>"

Nu har jeg så bygget en isolator til at få det tal ud der står imellem <i> og </i>

toValidate.substr((toValidate.find("<i>")+3),(toValidate.find("</i>")-(toValidate.find("<i>")+3)));

Og det virker også fint nok, men nu kommer mit problem, jeg vil meget gerne havde at jeg kan undersøge denne her streng for om det er et heltal tal i et decimal skema. altås efter 10 tals systemet?

Er det lad siggørligt?
Avatar billede arne_v Ekspert
11. marts 2004 - 13:55 #1
Kan du ikke bar echecke om der er et punktum/komma i det du finder mellem
<i> og </i> ?

Har du iøvrigt overvejet at finde en regular expression pakke til den
her slags problem stillinger ?
Avatar billede withli Nybegynder
11. marts 2004 - 14:22 #2
Niksen, for hvis jeg checker på punktum komma, så kan jeg jo snildt misse alpha karakterer.

Hmmm niksen jeg har faktisk ikke overvejer reg exp endnu, men det kunne være at der var nogle der kunne løse min kattepine, har du et link til nogle gode steder som omhandler reg exp? jeg ved hvad de er, men det er dælme lang tid siden at jeg har brugt dem, og det var i perl.
Avatar billede withli Nybegynder
11. marts 2004 - 14:33 #3
Nu er min plan så at konvertere std::string toValidate til en char* og så køre en atoi på den, men så kommer mit nummer to spørgsmål hvordan dælen får jeg c++ til at acceptere en cast fra std::string til char* det er den nemlig heller ikke særlig glad for.
Avatar billede withli Nybegynder
11. marts 2004 - 14:49 #4
Okay det svarer jeg hurtigt lige på, så jeg ikke kommer af med nogle dumme point, det er selvfølgelig via c_str jeg konverterer den ( dumme robert )
Avatar billede arne_v Ekspert
11. marts 2004 - 14:59 #5
atoi er ikke god til at teste for bogstaver. Den returnerer nemlig bare nul.

strtol er meget bedre !
Avatar billede arne_v Ekspert
11. marts 2004 - 15:00 #6
Jeg lavede engang dette her 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");
}
Avatar billede arne_v Ekspert
11. marts 2004 - 15:00 #7
Med hensyn til regexp skal vi nok lige høre hvilken compiler du bruger.
Avatar billede withli Nybegynder
11. marts 2004 - 15:06 #8
Jeg bruger visual Studio 2003.net compileren.

Jeg er efterhånden kommet frem til samme resultat som dig arne.

Min kode der gør noget ser sådan her ud.

std::string tempStr = toValidate.substr((toValidate.find("<i>")+3),(toValidate.find("</i>")-(toValidate.find("<i>")+3)));
            const char* tempBuff = tempStr.c_str(); 
            int isAnInt = atoi(tempBuff);

Det kunne nok laves smartere, men det gør det den skal, det er fint nok at den returnerer en nul hvis den ikke er et tal, men hvad nu hvis det var et nul der stod i strengen?

Jeg prøver lige at brække lidt på dit eksempel og se om det gør tricket pænere.
Avatar billede withli Nybegynder
11. marts 2004 - 15:09 #9
MEd hensyn til strtol og atoi, vil det så ikke være kløgtigere at benytte atoi, hvis jeg skal kompilere mit stuff på en unix box også?...hvilket jeg bliver nød til, senere.
Avatar billede arne_v Ekspert
11. marts 2004 - 15:12 #10
Det er det som strtol gør bedre.

strtol er helt standard !
Avatar billede withli Nybegynder
11. marts 2004 - 15:17 #11
Modtaget, og jeg som troede at det var omvendt.

Men strtol returnerer da også nul hvis den ikke kunne lave Conversionen gør den ikke? og så er jeg vel et eller andet sted henne ligevidt?
Avatar billede arne_v Ekspert
11. marts 2004 - 15:20 #12
Finessen ved strtol er det andet argument, hvor den returnerer hvor den stoppede
parsningen (d.v.s. hvor i strengen den fandt det første ikke valide tal).

Se koden jeg postede.
Avatar billede withli Nybegynder
11. marts 2004 - 15:38 #13
Neat, den havde jeg ikke lige tittet, det er dælme i orden.

Der er altid kanon hjælp at få når du er i nærheden, takker.
Avatar billede arne_v Ekspert
11. marts 2004 - 15:40 #14
så vil jeg ligge et svar
Avatar billede withli Nybegynder
11. marts 2004 - 15:41 #15
There ya go
Avatar billede arne_v Ekspert
11. marts 2004 - 17:37 #16
Med hensyn til regexo

Hvis du bruger managed .NET kode så er regexp allerede supporteret.

Ellers skal du have fat på noget som:
  http://www.tropicsoft.com/Components/RegularExpression/
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