Avatar billede Daniel.E Praktikant
25. august 2004 - 22:25 Der er 28 kommentarer og
1 løsning

udtrække tal fra streng

char *streng = "hej40okds99";

hvordan får jeg de 2 tal 40 og 99 til at så i hver sin int variabel, så man kunne plusse dem sammen f.eks ??




vb2
Avatar billede arne_v Ekspert
25. august 2004 - 22:30 #1
Det afhænger jo lidt af hvor fast formatet er.

Hvis det er meget fast så:

  int tal1,tal2;
  tal1 = atoi(streng + 3);
  tal2 = atoi(streng + 9);
Avatar billede Daniel.E Praktikant
25. august 2004 - 22:31 #2
det er det ikke.
strengen er dynamisk sammensat, og man kan ikke forudse statisk sammenhæng.
Avatar billede bertelbrander Novice
25. august 2004 - 22:37 #3
#include <stdio.h>

int main(void)
{
  char *streng = "hej40okds99";
  char Dummy1[123], Dummy2[123];
  int n1, n2;
  sscanf(streng, "%[^1234567890]%d%[^1234567890]%d", Dummy1, &n1, Dummy2, &n2);
  printf("%d - %d\n", n1, n2);
  streng = "Perte120Poul9119";
  sscanf(streng, "%[^1234567890]%d%[^1234567890]%d", Dummy1, &n1, Dummy2, &n2);
  printf("%d - %d\n", n1, n2);
  return 0;
}
Avatar billede arne_v Ekspert
25. august 2004 - 22:39 #4
Så prøv:

  int tal1,tal2;
  int ix = 0;
  ix = ix + strspn(streng+ix,"0123456789");
  ix = ix + strcspn(streng+ix,"0123456789");
  tal1 = atoi(streng + ix);
  ix = ix + strspn(streng+ix,"0123456789");
  ix = ix + strcspn(streng+ix,"0123456789");
  tal2 = atoi(streng + ix);
Avatar billede Daniel.E Praktikant
25. august 2004 - 22:45 #5
begge eks virker som de skal. I må gerne give jeres svar.
Avatar billede bertelbrander Novice
25. august 2004 - 22:51 #6
Jeg forsøger at undgå point.
Avatar billede arne_v Ekspert
25. august 2004 - 22:53 #7
svar
Avatar billede Daniel.E Praktikant
25. august 2004 - 22:55 #8
hey Arne_v, hvis du godt vil have 30 point xtra, så kunne jeg godt tænke mig at vide hvordan man gør dette.

char *streng =  "19*10/3"

resultatet skulle gerne give 63.333
Avatar billede Daniel.E Praktikant
25. august 2004 - 22:55 #9
bertalbrander

ok, tak for hjælpen :)
Avatar billede Daniel.E Praktikant
25. august 2004 - 22:56 #10
men arne_v, det kunne lige så godt stå "71+41-41/41*456+454" og så i en uendelighed...
Avatar billede arne_v Ekspert
25. august 2004 - 22:58 #11
Det du beder om er en expression evaluator.

Jeg mener at jeg har noget kode liggende.
Avatar billede arne_v Ekspert
25. august 2004 - 23:01 #12
Det har jeg, men jeg skal lige have det hevet ud af en anden kontekst.

Giv mig en times tid.
Avatar billede Daniel.E Praktikant
25. august 2004 - 23:02 #13
arne_v hvis det er noget som er til meget besvær, så giver jeg gerne flere point.
Avatar billede bertelbrander Novice
25. august 2004 - 23:03 #14
Man kunne også kikke på denne:

http://www.gnu.org/software/bc/
Avatar billede arne_v Ekspert
26. august 2004 - 00:14 #15
Det bliver først imorgen ...
Avatar billede Daniel.E Praktikant
26. august 2004 - 00:24 #16
ok
Avatar billede arne_v Ekspert
26. august 2004 - 13:01 #17
Test program:

#include <iostream>

using namespace std;

#include "expr.h"

int main()
{
  FloatExpression e1(infix2postfix(FloatExpression("19*10/3")));
  cout << e1.Value() << endl;
  FloatExpression e2(infix2postfix(FloatExpression("71+41-41/41*456+454")));
  cout << e2.Value() << endl;
  return 0;
}

Output:

63.3333
110

Koden kan downloades her:

http://www.vajhoej.dk/arne/eksperten/expr/
Avatar billede arne_v Ekspert
26. august 2004 - 13:05 #18
Koden er lidt gammeldages da den er skrevet midt i 90'erne.

Den er som dsagt taget ud af en større kontekst, så jeg håber at jeg har
fået konverteret den rigtig.

Bl.a. har jeg ret ukritisk konverteret et error message system til nye
ANSI C++ throws.

Ovenstående kode ser nok lidt konvoluted ud (fordi man eksplicit skal konvertere
fra infix til postfix.

Men det bibliotek kan meget meget mere. Bl.a. kan man definere variable
og udregne samme expression flere gange for forskellige værdier af variable.
Og så giver det pludselig mening kun at konvertere fra infix til postfix
en gang.
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:26 #19
arne_v er det kun  #include "expr.h" jeg har brug for ?
Avatar billede arne_v Ekspert
26. august 2004 - 14:28 #20
Nej.

Du har brug for alt: expr.h + sym.h + list.h + expr.cpp + sym.cpp + list.cpp
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:30 #21
hold da helt fast, det er en masse kode.  Hvem har programmeret det ?
Avatar billede arne_v Ekspert
26. august 2004 - 14:36 #22
Det har jeg for næsten 10 år siden.
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:36 #23
jeg får en hel masse fejl når jeg compiler

--------------------Configuration: TEST - Win32 Debug--------------------
Compiling...
TEST.CPP
Linking...
TEST.OBJ : error LNK2001: unresolved external symbol "public: double __thiscall FloatExpression::Value(void)" (?Value@FloatExpression@@QAENXZ)
TEST.OBJ : error LNK2001: unresolved external symbol "public: __thiscall FloatExpression::~FloatExpression(void)" (??1FloatExpression@@QAE@XZ)
TEST.OBJ : error LNK2001: unresolved external symbol "public: __thiscall Expression::~Expression(void)" (??1Expression@@QAE@XZ)
TEST.OBJ : error LNK2001: unresolved external symbol "public: __thiscall FloatExpression::FloatExpression(class Expression const &)" (??0FloatExpression@@QAE@ABVExpression@@@Z)
TEST.OBJ : error LNK2001: unresolved external symbol "class Expression __cdecl infix2postfix(class Expression)" (?infix2postfix@@YA?AVExpression@@V1@@Z)
TEST.OBJ : error LNK2001: unresolved external symbol "public: __thiscall Expression::Expression(class Expression const &)" (??0Expression@@QAE@ABV0@@Z)
TEST.OBJ : error LNK2001: unresolved external symbol "public: __thiscall FloatExpression::FloatExpression(char *)" (??0FloatExpression@@QAE@PAD@Z)
Debug/TEST.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.

TEST.exe - 8 error(s), 0 warning(s)
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:38 #24
bare det er i orden med dig at jeg bruger din kode
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:46 #25
jeg har fået det til at virke
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:46 #26
arne_v du får 120 points....er det ok ?
Avatar billede Daniel.E Praktikant
26. august 2004 - 14:55 #27
vi siger 150..det er mere rundt :)
Avatar billede arne_v Ekspert
26. august 2004 - 14:58 #28
Jeg takker.

Der ligger meget funktionalitet i den kode.

Den kan også differentiere.
Avatar billede arne_v Ekspert
26. august 2004 - 22:44 #29
Her er et bedre test program:

#include <iostream>

using namespace std;

#include "expr.h"

int main()
{
  FloatExpression e1("19*10/3");
  FloatExpression e1x = infix2postfix(e1);
  cout << e1x.Value() << endl;
  FloatExpression e2("71+41-41/41*456+454");
  FloatExpression e2x = infix2postfix(e2);
  cout << e2x.Value() << endl;
  FloatExpression e3("X^2+2*X+1");
  FloatExpression e3x = infix2postfix(e3);
  for(int i=0;i<=10;i++)
  {
      ExprDefineVariable("X",(double)i);
      cout << e3x.Value() << endl;
  }
  FloatExpression e4("X^2+2*X+3");
  cout << e4.String() << endl;
  FloatExpression e4x = infix2postfix(e4);
  FloatExpression e4dif = postfix2infix(e4x.Derive("X"));
  cout << e4dif.String() << endl;
  return 0;
}

output:

63.3333
110
1
4
9
16
25
36
49
64
81
100
121
X^2+2*X+3
X*2+2
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