# Teil eines Strings extrahieren...



## reto-meier (25. März 2009)

Schönen guten Tag miteinander!

Ich habe ein kleines Problem... Ich programmiere in C++. 

Ich möchte nun aus einem vorhandenen String ein wichtiges "schlag-wort/zahl" vom rest extrahieren. Die aufgabenstellung könnte wie folgt aussehen: (Bsp.)

- Definiere einen String mit folgendem Inhalt: „XYZXYXZYXZYXZSendepegel : 95% hgh“
Was mich hier interessiert ist die grösse des Sendepegels also ist es meine absicht, hier den  Wert  95 zu extrahieren.
- danach möchte ich noch eine Ausgabe am Bildschirm, welche mir den wert anzeigt.

Hoffe auf eure Unterstützung und Grüsse aus der Schweiz

Reto


----------



## vfl_freak (25. März 2009)

Moin,

je nachdem könntest Du bspw. sowas wie SUBSTR benutzen oder auch die beliebten Pattern zum splitten des String! Das hängt aber sicher vom jeweiligen Aufbau ab ...

Gruß
Klaus


----------



## reto-meier (25. März 2009)

vfl_freak hat gesagt.:


> Moin,
> 
> je nachdem könntest Du bspw. sowas wie SUBSTR benutzen oder auch die beliebten Pattern zum splitten des String! Das hängt aber sicher vom jeweiligen Aufbau ab ...
> 
> ...




Vielen Dank für den Hinweis...hab kurz nachgeschaut welcher Befehl besser passt. 
Hab mich für den SUBSTR-Befehl entschieden...Hab jedoch nicht herausgefunden wie ich nach einer Zahl "suchen" kann....:suspekt:


----------



## vfl_freak (25. März 2009)

Hallo,

nach einer Zahl suchen ? ? ?:suspekt:

Normalerweise gibst Du dem _*substr*_ zwei Parameter mit:

```
string strIrgendwas; // bsp. 100 Zeichen lang

// kopiert ab Position 20 die nächsten 10 Zeichen!
string strTest = strIrgendwas.substr( 20, 10 );
```

Wenn in Deinem String als Zahlwerte NUR die Gesuchte vorkommt, kannst Du ihn bspw. auch zeichenweise durchlaufen und mit _*IsDigit*_ prüfen ! !

gruß
Klaus


----------



## reto-meier (25. März 2009)

vfl_freak hat gesagt.:


> Hallo,
> 
> nach einer Zahl suchen ? ? ?:suspekt:
> 
> ...



Oke jetzt ist mir dies klar geworden..danke erstmal.
Nun: wie kann ich die kopierten Zeichen ausgeben?

Ich habe es so probiert: 

printf("%s",strTest);
string strTest = dddddddddd90dkjfasdl.substr( 11, 2 );

Das Fenster schliesst jedoch ohne die beiden zeichen auszugeben...


----------



## vfl_freak (25. März 2009)

Hallo,
schlauer war es so herum:

```
string strTest = dddddddddd90dkjfasdl.substr( 11, 2 );
printf("%s",strTest);
```

Merke - immer erst erst die Variable setzen und dann ausgeben 

Gruß
Klaus


----------



## reto-meier (25. März 2009)

vfl_freak hat gesagt.:


> Hallo,
> schlauer war es so herum:
> 
> ```
> ...



uups sorry...ist mir klar. hab ich auch soo geschrieben...funktioniert leider trotzdem nicht.


----------



## vfl_freak (25. März 2009)

Hallo,
ich kenne jetzt den umliegenden Code nicht, daher kann ich nur raten!
Dann musst Du halt das Schließen des Fenster, in dem Du die Werte darstellst, unterbinden! 
Bspw. durch eine längere Schleife, die sonst nix tut oder ggf. den Thread (falls es einer ist) mit sleep(xx) ruhen lassen oder auf eine Eingabe des Users zum Beenden abwarten ....
Gruß
Klaus


----------



## reto-meier (25. März 2009)

vfl_freak hat gesagt.:


> Hallo,
> ich kenne jetzt den umliegenden Code nicht, daher kann ich nur raten!
> Dann musst Du halt das Schließen des Fenster, in dem Du die Werte darstellst, unterbinden!
> Bspw. durch eine längere Schleife, die sonst nix tut oder ggf. den Thread (falls es einer ist) mit sleep(xx) ruhen lassen oder auf eine Eingabe des Users zum Beenden abwarten ....
> ...



hmmm...stelle meinen code mal ins netz.. habe diese dinge schon ausprobiert...gescheiter werde ich noch nicht.

CODE:

//Programmier-Projekt von Reto Meier, 25.3.09 
//Aufgabe3: Text-String Verarbeitung, Ein Teil des Strings soll extrahiert werden.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;
string strjasfkljasgj90lsdkfj;

int main(int argc, char *argv[])
{   while(1)
    {
    string strTest = strjasfkljasgj90lsdkfj.substr(11,2);
    printf("%s",strTest);
    system("PAUSE");
    return EXIT_SUCCESS;
    }
}


----------



## vfl_freak (25. März 2009)

poste ihn doch einfach hier ..........  ;-]


----------



## reto-meier (25. März 2009)

vfl_freak hat gesagt.:


> poste ihn doch einfach hier ..........  ;-]



 auf diese idee bin ich gerade auch gekommen ;-)


----------



## vfl_freak (25. März 2009)

Hallo,

also ich würde statt 

system( "PAUSE" );

lieber dies nehmen:

```
cout << "Hallo! Bitte drücken Sie Enter um fortzufahren";
getchar();
```

Was genau funktioniert denn nicht ?
Gruß
Klaus


----------



## Mizi Mace (25. März 2009)

Einen wunderschönen guten Tag,

wie es mir scheint ist noch nicht alles klar. Erstmal ist der gesamte Quellcode ein rumgewurstel aus C und C++. Wenn du C++ verwenden willst, dann solltest du das auch konsequent machen.

Um in C++ Strings verwenden zu können, musst du den Header string einbinden. Dieser und die dazugehörige Bibliothek sollte jeder moderne Compiler mitliefern. Du verwendest meines Wissens Dev-C++ und MINGW. Dort ist das vorhanden. Also genügt:


```
#include <string>
```

Dann weiß ich nicht, was du mit der Zeile:


```
string strjasfkljasgj90lsdkfj;
```

bewirken willst. Hier wird eine Variable mit der Bezeichnung strjasfkljasgj90lsdkfj vom Typ string angelegt. Aber das ist ja deine Zeichenkette. Dass er hier


```
string strTest = strjasfkljasgj90lsdkfj.substr(11,2);
```

dann nichts auslesen kann, ist dann auch klar. In den String ist ja nichts drin. Du musst also zunächst einen Quellstring mit deiner Zeichenkette anlegen:


```
string source = "strjasfkljasgj90lsdkfj";
```

Dann kannst du mit der Methode substr(pos, n) einen Teilstring erzeugen, der an der Position pos des Quellstrings beginnt und die n darauffolgenden Zeichen umfasst. Diesen kannst du dann in einen Zielstring speichern:


```
string target = source.substr(11,2);
```

Die Ausgabe mit printf() sollte in der Form nicht funktionieren. Besser ist es den Standardausgabestream cout zu verwenden. Dieser ist typsicher und leichter zu handhaben:


```
cout << target;
```

Wenn du nun damit dein Programm zusammenstellst, solltest du die Ausgabe "sg" bekommen, da "s" an der 11. Position des Quellstrings steht und der Zielstring 2 Zeichen lang sein soll. Damit wird noch das nachstehende "g" gespeichert. Ich denke nicht, dass dies die Funktion ist, die du haben wollest. Oder ist die Zahl immer exakt an der gleichen Position? Ansonsten solltest du nach den ersten Aufkommen einer Ziffer im String suchen. Du erhälst eine Position, wo deine Zahl beginnt. Dann suchst du nach dem ersten Zeichen beginnend bei dieser Position, welches keine Ziffer ist. Du erhälst die Position, vor welcher deine Zahl endet. Das Ganze kannst du mit den Methoden find_first_of() und find_first_not_of() realisieren.

Gruss
Mizi


----------

