Forum: PC-Programmierung Zahl aus String auslesen


von Robert B. (rsb89)


Lesenswert?

Hallo miteinander,

ich habe einen String in dem eine Zahl ist. Wie bekomme ich diese Zahl 
aus dem String?

Vorraussetzungen:
1. Ich weiß nicht wie viele Stellen diese Zahl hat.
2. Ich weiß, dass diese Zahl nach dem ersten Leerzeichen kommt.

Mir fällt da jetzt nur ein:
-Suche nach dem ersten Leerzeichen im String. Merken!
-Suche nach dem zweiten Leerzeichen im String. Merken!
-"memcpy()" die Zeichen die zwischen den beiden Leerzeichen in einen 
neuen String
-"atoi()" den neuen String.

Geht doch sicher einfacher, oder nicht?

: Verschoben durch Moderator
von Daniel F. (df311)


Lesenswert?

die ersten zwei punkte könntest du noch durch strtok ersetzen, nachteil 
an der ganzen lösung ist aber, dass die verwendeten funktionen meistens 
nicht gerade sparsam mit flash und arbeitsspeicher umgehen.
ich würde das ganze selber lösen (beginn so ähnlich wie du schon 
geschrieben hast, den teil in der mitte aber durch einfache 
multiplikation und addition ersetzen.
achtung auf die größe der zahlen, wenn die breiter mehr als 16 bit 
werden, dann wird die performance noch lahmer...

von Thomas (Gast)


Lesenswert?

Was für eine Zahl? Mit Komma? Mit Minuszeichen? 34.0 und/oder 34,0? 
3.4e1?

von Udo S. (urschmitt)


Lesenswert?

Welche Programmiersprache?
atoi, also wohl C oder C++
Du könntest das 2. Leerzeichen duch ein binäres 0 ersetzen und dann atoi 
auf den Offset+1 des ersten Leerzeichens ansetzen. Das erspart dir das 
Umkopieren.
Falls der String anschliessend weiterverwendet werden soll die 0 wieder 
durch ein Blank ersetzen.
Ansonsten gehts so wie du es beschrieben hast.

von Udo S. (urschmitt)


Lesenswert?

Daniel F. schrieb:
> achtung auf die größe der zahlen, wenn die breiter mehr als 16 bit
> werden, dann wird die performance noch lahmer...

Der Thread steht in PC Hard und Software, nicht in AVR Microcontroller 
:-)

von Daniel F. (df311)


Lesenswert?

EDITH sagt genauer lesen.
habe gerade gesehen, dass wir uns hier im bereich pc-programmierung 
aufhalten. also den ganzen quatsch mit flash und arbeitsspeicher, 
zahlengröße, etc. vergessen und nur den ersten halbsatz lesen. dann 
dürfte das ganze auch ganz gut funktionieren, v.a. weil dann auch noch 
eine memcpy wegfallen müsste (habe strtok nicht auswendig im kopf)

p.s. meine änderung und udos beitrag haben sich überschnitten ;-)

von Robert B. (rsb89)


Lesenswert?

Super Danke! Probiere das gleich mal mit der 0.

Und ja die Sprache ist C (Sorry wegen der fehlenden Info ;)) und es 
handelt sich ausschließlich um natürliche Zahlen (Byte-Angaben).

von DirkB (Gast)


Lesenswert?

Auf einem PC kann man aber strtok durchaus einsetzen.
Das ist aber auch nicht nötig.

Mit strchr nach den Leerzeichen suchen und dann gleich mit strtol (oder 
atoi) an der Fundstelle+1 umwandeln. Ohne memcpy.

Das geht auch mit sscanf
1
char text[] ="Hallo 4711"
2
char dummy[1];
3
int  zahl;
4
5
sscanf("%*s%d", dummy, &zahl);  // der sub-specifier * speichert die Daten nicht

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

R. B. schrieb:
> Mir fällt da jetzt nur ein:
> -Suche nach dem ersten Leerzeichen im String. Merken!
> -Suche nach dem zweiten Leerzeichen im String. Merken!
> -"memcpy()" die Zeichen die zwischen den beiden Leerzeichen in einen
> neuen String
> -"atoi()" den neuen String.
>
> Geht doch sicher einfacher, oder nicht?

Ja. atoi erkennt das Ende der Zahl, also genügt es, das erste 
Leerzeichen im String zu suchen und atoi einen Pointer auf das auf 
dieses Leerzeichen folgende Zeichen zu übergeben. Keine Stringkopie 
nötig, fertig.

Wobei atoi auch keine Probleme mit führenden Leerzeichen hat, also kann 
man auch direkt einen Pointer auf das erste gefundene Leerzeichen 
übergeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.