PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : einsatz von sscanf



pablo
28-12-2005, 14:44
Moechte aus einem String die numerischen Werte extrahieren. Also zB


"bahjds 3 dsdsd 34 dsds 3.63 dsds";

die numerischen Wete, also 3, 34 und 3.63 auslesen und in folat Variable abspeichern.

Die Form des string, die Zahl der zahlen im string und Position ist nat. nicht fest, sondern dynamisch

Caveman
28-12-2005, 15:54
Eine Möglichkeit für C mit char*:


int i = 0, n = 0;
char* str = "bahjds 3 dsdsd 34 dsds 3.63 dsds";
char** zahlen = {'\0'; '\0'}; // bin mir an dieser Stelle nicht ganz sicher

while( ( i = strcspn(str, "0123456789.") ) > 0 )
{
if( i != 0 )
n++;

strncat (zahlen[n], str[i], 1);
}

nicht getestet, Bufferüberlauf vorprogrammiert

Der String str wird abgetastet nach Zahlen und Punkt (Komma) und diese werden dann in den Strings zahlen abgespeichert.

Ich würde allerdings das ganze Problem mit C++ anpacken und würde statt char* string verwenden.

Edit: Achtung! In der Schleife fehlt am Ende noch eine Funktion die den String str um die Zeichen kürzt, die vor der gefundenen Zahl (incl. dieser) sind.
Edit2: Dies ist nur eine Idee!!!

pablo
28-12-2005, 22:40
hm gibts da nicht was eleganteres und speicherueberlaufunauffaelligers mit sscanf? eig. is doch die bib-funktion genau fuer sowas gedacht!?

Caveman
29-12-2005, 13:12
Dann hätte ich diese Lösung anzubieten:


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

int main()
{
char str [80] = "bahjds 3 dsdsd 34 dsds 3.63 dsds";
char eins[20], zwei[20], drei[20];
float f_eins, f_zwei, f_drei;

sscanf(str, "%s%f%s%f%s%f", eins, &f_eins, zwei, &f_zwei, drei, &f_drei);

printf("%.2f - %.2f - %.2f\n", f_eins, f_zwei, f_drei);
printf("%s - %s - %s\n", eins, zwei, drei);

return 0;
} Hier sei allerdings anzumerken, dass man genau wissen muss, wie der String aufgebaut ist (oder man baut eine Fallunterscheidung mit ein).

pablo
29-12-2005, 18:55
hm so ist es aber nicht dynamisch!?!

BLUESCREEN3D
29-12-2005, 22:26
Wenn du was dynamisches willst - in diesem Fall beliebig viele Zahlen mit Text dazwischen - musst du das eben selber programmieren...

Caveman
30-12-2005, 09:56
Mit sscanf wirst Du es nicht dynamisch hinbekommen.

Dann schon eher mit einer Methode, dass Du den String Zeichen für Zeichen absuchst und prüfst, ob es ein Buchstabe oder eine Zahl ist bzw. dass Du bis zur nächsten Zahl suchst und alles vorher wegwirfst, so wie ich es im Beitrag vom 28-12-2005, 16:54 (etwas missglückt) versucht habe.