Zeichenkette auffriemeln

Gast #1756642
Guten Tag!


Aus einer immerwährenden Zeichenkette (RS232), z.B.

...wert82grad...

soll nur die 82 in C extrahiert werden.

Ich habe etliche Zeichenkettenfunktionen gefunden, aber keine, die mein 
Problemchen löst.

Weiss jemand Rat? Hab viel Gutes über dieses Forum gehört!
Bernd Kretschmar schrieb:

> soll nur die 82 in C extrahiert werden.
>
> Ich habe etliche Zeichenkettenfunktionen gefunden, aber keine, die mein
> Problemchen löst.

Mit regular Expression im Formatstring eines sscanf müsste das gehen. 
Jedoch hab ich keine Erfahrung mit regular Expressions.

Ich machs immer traditionell:
Den Anfang der Zahl suchen. Das geht ganz leicht in einer Schleife 
beginnend am Stringanfang solange einen Pointer erhöhen, bis man auf das 
erste isDigit() Zeichen stösst.
Ab dort dann einen atoi() oder einen strtol() ansetzen und man hat die 
Zahl.


Ein Programmierer muss unter anderen diese beiden Dinge beherrschen
* Kentniss der Funktionen, die er zur Verfügung hat
* Wie kann man mehrere Funktionen bzw. typische Programmuster
  kombinieren um das Gewünschte zu erhalten


Ein typisches Muster in der Stringverarbeitung ist nun mal:
1
  char  irgendeinString[] = "...wert82grad...";
2

3
  // man nehme eine Pointervariable
4
  char* pLoop;
5

6
  // und richte es so ein, dass der Pointer auf den Anfang eines Strings zeigt
7
  pLoop = irgendeinString;
8

9
  // jetzt alle Zeichen des Strings durchgehen
10
  // und gegebenenfalls eine Aktion mit dem Zeichen durchführen
11
  // oder die Schleife vorzeitig abbrechen oder ...
12
  //
13
  // der springende Punkt ist, dass *pLoop das Zeichen darstellt und
14
  // mittels pLoop++ ein Zeichen nach dem anderen in der Schleife besucht
15
  // wird
16
  while( *pLoop && irgendeine Bedingung die das Zeichen *pLoop erfüllen soll )
17
    mach eventuell etwas mit dem Zeichen *pLoop
18

19
    pLoop++;
20
  }

Das arbeitet alle Zeichen in einem String durch. Zb. könnte diese 
Schleife so lange laufen bis
   isDigit( *pLoop )
durch ein TRUE meldet, dass *pLoop eines der Zeichen '0', '1', '2', '3', 
'4', '5', '6', '7', '8' oder '9' ist.
Damit wäre der Anfang der 'Zahl' im String gefunden. atoi möchte einen 
Pointer haben, der auf den Anfang einer 'Zahl' in einem String zeigt. 
Passt perfekt, genau den Pointer haben wir ja, nachdem in der Schleife 
der Anfang der 'Zahl' gefunden wurde.
Gast
du wist hier bestimmt keine fertige Lösung bekommen, denn du kannst dein 
Problem recht leicht selber lösen.

ich Tippe mal, du benutzt C als Programmiersprache?

Wenn ja, dann such mal nach String-Funktionen für C, oder welche 
Programmiersprache auch immer du benutzt.
Gast
Karl heinz Buchegger schrieb:
> Ein Programmierer muss unter anderen diese beiden Dinge beherrschen
> * Kentniss der Funktionen, die er zur Verfügung hat
> * Wie kann man mehrere Funktionen bzw. typische Programmuster
>   kombinieren um das Gewünschte zu erhalten

Ach! Das kommt dann wohl im zweiten Semester? ;-)
Gast
Bernd Kretschmar schrieb:
> Aus einer immerwährenden Zeichenkette (RS232), z.B.

und wenn es ein stetiger Bytestrom ist (das interpretiere ich aus 
"immerwährenden") der dann in der Verarbeitung natürlich in irgendeiner 
Form geblockt ist, denk daran bei den Blocks für die Suche eine 
ausreichende Überlappung zu machen.
Sprich wenn Du Dein obiges Beispiel nimmst:

wert82grad und 82 wird gesucht, kann es passieren daß Du 2 Blöcke hast 
mit:
...wert8   2grad...
dann findest Du einen String der Länge 2 nur dann, wenn Du den 2. Block 
mit einem Zeichen überlappst also:
...wert8 und  82grad...

Allgemein: Wenn Du einen String der Länge X suchst musst Du X-1 
überlappen.

Aber nur zum Suchen, nicht zum weiterverarbeiten überlappen.
Wenn ich Zahlen oder was auch immer aus ner RS232 raussuchen will/muß, 
mache ich das mit ner statemachine, die ich mit den Zeichen füttere die 
reinkommen und die mir ggf. ne fertige Zahl zurückliefert. Also im 
Beispiel: Zustände: SUCHE_ZAHL_BEGINN, SUCHE_ZAHL_ENDE und dann anhand 
der reinkommenden Zeichen die Zustände wechseln. Zeichen in Zahlen sind 
dann beispielsweise -+.,eE oder was auch immer. Den rausgeschnittenen 
Zahlenstring dann mit sscanf oder ähnlich behandeln.

Ja, so könnte das gehen.
Cheers
Detlef
Gast
Klaus Wachtler schrieb:
> int   meine82, ret;
> ret = sscanf( puffer, "%*[^0-9]%d", &meine82 );
> // ret ist 1, wenn das Lesen geklappt hat
Gibt es zu dem Thema, also reguläre Ausdrücke mit sccanf und Co. ohne 
boost, irgendwo etwas zum Nachlesen?
Also mit "C regexp", "sccanf reguläre Ausdrücke" und ähnlichem kam ich 
nicht wirklich weiter und boost muss imho nicht sein. Mein C-Buch ist 
auch nicht wirklich hilfreich.
Gast
Sorry ;(

sscan ist in 7.19.6.7 The sscanf function

aber : 2 The sscanf function is equivalent to fscanf, except that...

also fast richtig ;)

Die 3,6 MB sind scheinbar beliebt.

avr
dagger schrieb:
> Klaus Wachtler schrieb:
>> int   meine82, ret;
>> ret = sscanf( puffer, "%*[^0-9]%d", &meine82 );
>> // ret ist 1, wenn das Lesen geklappt hat
> Gibt es zu dem Thema, also reguläre Ausdrücke mit sccanf und Co. /ohne/
> boost, irgendwo etwas zum Nachlesen?
> Also mit "C regexp", "sccanf reguläre Ausdrücke" und ähnlichem kam ich
> nicht wirklich weiter und boost muss imho nicht sein. Mein C-Buch ist
> auch nicht wirklich hilfreich.

Daß du damit nichts findest, ist verständlich.
Das liegt dran, daß es keine regulären Ausdrücke sind (auch wenn es
hier gelegentlich so steht).

Zu scanf: 
http://www.wachtler.de/ck/19_4_Liste_Funktionen.html#SECTION0002049200000000000000

Zu printf: 
http://www.wachtler.de/ck/19_4_Liste_Funktionen.html#SECTION0002048100000000000000
Gast
avr schrieb:
> Die 3,6 MB sind scheinbar beliebt.
Danke für das pdf. Naja, wenn die Suchmaschine Recht hat, ist dass der 
letzte frei herunterladbare C-Standard, zumindest scheint der aktuellste 
nur gegen Registrierung herunterladbar zu sein. Warum auch immer man 
sich für einen ansonsten kostenlosen Standard registrieren soll.

Mano schrieb:
> Bei der Manpage von scanf steht ein wenig dazu.
Mist, da hätte ich auch selbst drauf kommen können, danke.

Klaus Wachtler schrieb:
> dagger schrieb:
>> Klaus Wachtler schrieb:
>>> int   meine82, ret;
>>> ret = sscanf( puffer, "%*[^0-9]%d", &meine82 );
>>> // ret ist 1, wenn das Lesen geklappt hat
>> Gibt es zu dem Thema, also reguläre Ausdrücke mit sccanf und Co. /ohne/
>> boost, irgendwo etwas zum Nachlesen?
>> Also mit "C regexp", "sccanf reguläre Ausdrücke" und ähnlichem kam ich
>> nicht wirklich weiter und boost muss imho nicht sein. Mein C-Buch ist
>> auch nicht wirklich hilfreich.
> Daß du damit nichts findest, ist verständlich.
> Das liegt dran, daß es keine regulären Ausdrücke sind (auch wenn es
> hier gelegentlich so steht).
Danke. Ah ok, auf deine Seite hätte ich auch kommen können... ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.