5.2 Textzeile in Zahlenfolge umwandeln, Version2
Gegenüber dem vorangegangenen Parsing-Beispiel in Textverarbeitung, wird hier der Text nicht in einer Variablen vom Typ string gespeichert (neue C++ Technik), sondern in einem Array vom Typ char (alte C-Technik). Es wird ferner ausgenutzt, dass die Länge einer Zeichenkette in char-Arrays anhand des Ende-Symbols '\0' erkannt wird. Die Funktion atof(..) sucht ab der übergebenen Adresse bis zum nächsten Auftreten des Ende-Symbols und probiert diese Zeichenfolge dann in eine double-Zahl umzuwandeln. Dies wird ausgenutzt, indem in das Text-Array "künstlich" Ende-Symbole hineingeschrieben werden, um Adressbereiche mit Zahlen zu untergliedern. Auch zum Auffinden des Endes des Geamten Strings wird das Ende-Symbol gesucht.
Das vorliegende Beispiel ist offenbar schwerer zu verstehen und schon dadurch leichter anfällig für Programmierfehler, wenn man es in einem anderen Zusammenhang verwenden möchte. Insbesondere wird hier der Zeiger verwendet, um ein eigentlich zusammenhängendes Objekt, nämlich den Text, in Unteradressbereiche aufzuspalten. Es empflielt sich, eher die string-Technik zu verwenden und von solchen Adressmanipulationen, auch in anderen Zusammenhängen, nur dann Gebrauch zu machen, wenn es sich nicht vermeiden lässt, oder wenn die Anforderungen an das Programm keine andere Alternative zulassen.
Unbestreitbar ist jedoch, dass sich mit Hilfe von Zeiger-Manipulationen sehr kurze und schnelle Programme schreiben lassen, bei denen das Umkopieren von Speicherbereichen auf ein Minimum reduziert werden kann.
#include <iostream>
#include <string.h>
#include <math.h>
#include "statistik.h"
using namespace std;
int main(void)
{
double werte[1000];
int i=0,aktuell=0,anzahl=0;
bool ende = false;
char text[200];
char* zeiger;
cout<<endl<<"Geben Sie Zahlen durch Kommata getrennt ein: ";
cin>>text;
do
{
if(text[i]=='\0')
ende = true;
if(text[i]==',' || text[i]=='\0')
{
text[i] = '\0';
zeiger = &text[aktuell];
werte[anzahl] = atof(zeiger);
cout<<"wert="<<werte[anzahl]<<endl;
anzahl++;
aktuell=i+1;
}
i++;
} while(!ende);
cout<<"Der Mittelwert lautet: "<<mittelwert(werte,anzahl);
return 0;
}
Code 5.2-1: C++ Programm "einfacher.cpp"
parseroldstyle, einfacher.cpp, statistik.h und einfacher.exe - Datei gepackt