mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeichenkette auffriemeln


Autor: Bernd Kretschmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
  char  irgendeinString[] = "...wert82grad...";

  // man nehme eine Pointervariable
  char* pLoop;

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

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

    pLoop++;
  }

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.

Autor: ein_unwissender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jens Karstedt (blauzahnmeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe lexer, scanner, parser

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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? ;-)

Autor: dagger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Karstedt schrieb:
> siehe lexer, scanner, parser
Wir sind im Forum: Mikrocontroller und Elektronik, da würde ich doch 
eher händisch an die Sache ran gehen. Für größere µCs läuft es wohl auf 
strstr() und sscanf() hinaus.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int   meine82, ret;
ret = sscanf( puffer, "%*[^0-9]%d", &meine82 );
// ret ist 1, wenn das Lesen geklappt hat

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: dagger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Manpage von scanf steht ein wenig dazu.

Autor: avr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo dagger,

in der ISO_C99 steht da einiges.

Deine Frage im Abschnitt

7.19.6.2 The fscanf function

Keine leichte Lektüre aber gut zum Nachschlagen ;)

avr

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.ht...

Zu printf: 
http://www.wachtler.de/ck/19_4_Liste_Funktionen.ht...

Autor: dagger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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... ;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dagger schrieb:
> Naja, wenn die Suchmaschine Recht hat, ist dass der
> letzte frei herunterladbare C-Standard

Nö.
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1425.pdf

Autor: dagger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> dagger schrieb:
>> Naja, wenn die Suchmaschine Recht hat, ist dass der
>> letzte frei herunterladbare C-Standard
> Nö.
> http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1425.pdf
Heute klappt ja gar nichts, aber egal, der Tag ist ja bald vorbei... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.