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
Annonceindlæg fra Computerworld
Gefion skaber fremtidens AI
Supercomputeren Gefion er Danmarks nye AI-kraftværk og skal sikre, at både forskning og virksomheder kan være med i den teknologiske front.
14. august 2025
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);
25. august 2004 - 22:31
#2
det er det ikke. strengen er dynamisk sammensat, og man kan ikke forudse statisk sammenhæng.
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; }
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);
25. august 2004 - 22:45
#5
begge eks virker som de skal. I må gerne give jeres svar.
25. august 2004 - 22:51
#6
Jeg forsøger at undgå point.
25. august 2004 - 22:53
#7
svar
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
25. august 2004 - 22:55
#9
bertalbrander ok, tak for hjælpen :)
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...
25. august 2004 - 22:58
#11
Det du beder om er en expression evaluator. Jeg mener at jeg har noget kode liggende.
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.
25. august 2004 - 23:02
#13
arne_v hvis det er noget som er til meget besvær, så giver jeg gerne flere point.
25. august 2004 - 23:03
#14
26. august 2004 - 00:14
#15
Det bliver først imorgen ...
26. august 2004 - 00:24
#16
ok
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/
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.
26. august 2004 - 14:26
#19
arne_v er det kun #include "expr.h" jeg har brug for ?
26. august 2004 - 14:28
#20
Nej. Du har brug for alt: expr.h + sym.h + list.h + expr.cpp + sym.cpp + list.cpp
26. august 2004 - 14:30
#21
hold da helt fast, det er en masse kode. Hvem har programmeret det ?
26. august 2004 - 14:36
#22
Det har jeg for næsten 10 år siden.
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)
26. august 2004 - 14:38
#24
bare det er i orden med dig at jeg bruger din kode
26. august 2004 - 14:46
#25
jeg har fået det til at virke
26. august 2004 - 14:46
#26
arne_v du får 120 points....er det ok ?
26. august 2004 - 14:55
#27
vi siger 150..det er mere rundt :)
26. august 2004 - 14:58
#28
Jeg takker. Der ligger meget funktionalitet i den kode. Den kan også differentiere.
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
Kurser inden for grundlæggende programmering