www.mikrocontroller.net

Forum: Compiler & IDEs String sachgerecht tranchieren - how to-


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
Wie zerlegt man eigentlich sachgerecht einen String?
Hintergrund ist der Versuch, über die serielle Schnittstelle 
benutzerdefinierte Befehle in einen mega128 einzugeben, also z.B. time 
123400, um die Uhrzeit zu stellen.
Derzeit versuche ich das so, dass ich den String in einer for-Schleife 
Zeichen für Zeichen nach dem Leerzeichen durchsuche und ihn dann via
strncpy(command,(char*)&auswertstring[0],leerzeichen);
strcpy(wert,(char*)&auswertstring[leerzeichen+1]);
in 2 Teile zerlege. Obschon eine Ausgabe zu debuggingzwecken zeigt, das 
beide  Strings enthalten, was sie sollen, klappt die spätere Auswertung 
nicht.
Vermutlich ist das eh alles viel zu kompliziert gedacht und angestellt.
Wie macht man es besserg?



Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Leerzeichen kannst du z.B. mit strchr finden. Dann gibt's noch 
strtok, welches dir das Kopieren der Stringdaten erspart, aber den 
eingegebenen String verändert (es ersetzt das gewählte Zeichen einfach 
durch den Stringterminator '\0' und gibt einen Zeiger auf das, was 
danach kommt, zurück).

> Obschon eine Ausgabe zu debuggingzwecken zeigt, das
> beide  Strings enthalten, was sie sollen, klappt die spätere Auswertung
> nicht.

Dem ersten String fehlt die Terminierung.

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

Bewertung
0 lesenswert
nicht lesenswert
Aus dem bischen Code, das du zeigst, kann man nicht wirklich
Rückschlüsse ziehen, wo bei dir der Fehler liegen könnte.

Solche Zerlegungen lassen sich aber gut mit strtok() und strcpy()
erledigen.

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

Bewertung
0 lesenswert
nicht lesenswert
Zu strtok() und der Zerlegung eines Komandos:

Vielleicht hilft dir auch das hier weiter
Beitrag "argc und **argv aus Textzeile ermitteln"
ohne dass ich viel über Strings in C schreiben muss :-)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es darum geht etwas kompliziertere Formate zu parsen, dann bietet 
sich vielleicht Ragel an:
http://www.cs.queensu.ca/~thurston/ragel/

Autor: Der Fönig (zotos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Zu strtok() und der Zerlegung eines Komandos:
>
> Vielleicht hilft dir auch das hier weiter
> Beitrag "argc und **argv aus Textzeile ermitteln"
> ohne dass ich viel über Strings in C schreiben muss :-)

Der Thread hinter dem Link von Karl Heinz basiert genau auf der Gleichen 
Aufgabenstellung.

Ich Habe eine Art Kommandozeile via Terminal und RS232 auf dem 
Controller realisiert.

Die Idee war es die Argumente und einen Argumenten Zähler an Funktionen 
zu übergeben. Dazu die vom PC bekannten argc und **argv Parameter zu 
benutzen.

Karl Heinz hat dort nicht nur die Lösung für die Umsetzung geliefert 
sondern es auch so erklärt das es wirklich gut zu verstehen ist. Danke 
noch mal.


Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Karl Heinz hat dort nicht nur die Lösung für die Umsetzung geliefert
> sondern es auch so erklärt das es wirklich gut zu verstehen ist.

Das macht der immer. Richtig beängstigend ;-)

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht würde es helfen wenn ich was von C-Programmierung verstehen 
würde ...
Wunderbarer Weise gibt es nicht eine Zeile in Deinem Programm, von der 
ich behaupten könnte dass ich sie lückenlos nachvollziehen kann.
Schon    int main()    ist mir ein Rätsel. An wen soll main denn die "0" 
zurückschicken und warum? Welches Zeichen ist "/0"? 0x00? Was macht 
eigentlich NULL? Was ist "\t"? Was passiert bei argv++ ? Ist argv zu 
diesem Zeitpunkt nicht "Dies ist   ein Test" oder zumindest ein Zeiger 
dahin?
printf kann ich wunderpar für PC-Programme verwenden weil da die 
Standartausgabe der Bildschirm ist, aber am mega128 ist kein Bildschirm 
dran, nur das weiss printf eben nicht ;-) .
Vielleicht läßt sich die Erklärung ja auf ein etwas niedrigeres Niveau 
ausdehnen.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Literaturhinweis:

Kernighan & Ritchie, Programmieren in C, zweite Auflage, Hanser-Verlag

Das klärt annähernd so gut wie alle Fragen des Flugwolfes - bis auf die 
embedded-spezifische Dinge (wohin gibt printf seine Daten aus?)

printf gibt auf jedem System seine Daten an stdout aus - und das ist auf 
PCs üblicherweise mit dem Textbildschirm verknüpft. Auf dem AVR kann es 
mit der seriellen Schnittstelle verheiratet* werden, und so landen 
Ausgaben auf einem angeschlossenen seriellen Terminal (oder einem PC mit 
einem Terminalemulator à la Hyperterm).

*) eigene putchar-Funktion implementieren, siehe Dokumentation des 
Compilers/dessen Standard-Library

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Literaturhinweis:
Kernighan & Ritchie,

Oh ja, das Werk kenne ich. Ich werfe ja Bücher in der Regel nicht weg, 
ganz schlechte verleihe ich höchstens in der Hoffnung, sie nicht 
zurückzubekommen, aber das konnte ich noch nicht einmal an jemanden 
verleihen. Sorry. Ich weiss das dieses Buch hier als die Bibel gehandelt 
wird, aber vielleicht liegt es an meiner atheistischen Seele, das ich 
mit diesem Buch absolut nichts anfangen kann. Ich finde nichts darin, 
die Erklärungen verstehe ich nicht und  wenn ich gezielt etwas suche, 
finde ich es nicht.
Mr Bucheggers Beispiel werde ich mir heute Abend mit meiner M&T-Schwarte 
zerpflücken und dann wird hoffentlich einiges klarer.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die zweite Auflage kannst Du nicht meinen.

Die erste ist grottenschlecht, und die würde ich auch entsorgen. Die 
beschreibt auch kein ANSI-C (C89), sondern dessen "K&R-C" genannten 
Vorgänger.

Die zweite hingegen beschreibt in verständlicher Weise alles, was man 
über C wissen muss -mit Ausnahme von "embedded-Spezialitäten".

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Vielleicht würde es helfen wenn ich was von C-Programmierung verstehen
> würde ...

Schaden würde es sicher nicht.

> Schon    int main()    ist mir ein Rätsel. An wen soll main denn
> die "0" zurückschicken und warum?

An den Aufrufer des Programms. Bei einem µC ohne Betriebssystem gibt's 
zwar meistens keinen, aber die Regel in C ist nunmal, daß main() immer 
einen int zurückliefern muß. Dabei gibt es die Werte 0, EXIT_SUCCESS und 
EXIT_FAILURE (die letzten beiden sind in stdlib.h definiert). 0 ist 
dabei mit EXIT_SUCCESS gleichbedeutend.

> Welches Zeichen ist "/0"? 0x00?

Meinst du '\0'? Das ist der Stringterminierer, also das Zeichen, das das 
Ende eines Strings markiert.

> Was macht eigentlich NULL?

Das ist ein Platzhalter für einen Nullzeiger, also einen, den man 
explizit auf nichts zeigen lassen will.

> Was ist "\t"?

Ein Tabulator. Aber im Programm steht " \t", also ein Leerzeichen und 
ein Tabulator.

> Was passiert bei argv++ ?

argv wird inkrementiert. Es handelt sich um einen Zeiger auf das erste 
Element eines Arrays. Nach dem Inkrementieren zeigt er auf das zweite.

> Ist argv zu diesem Zeitpunkt nicht "Dies ist   ein Test" oder zumindest
> ein Zeiger dahin?

argv (das vor dem Inkrementieren) ist ein zeiger auf "Dies". Nach dem 
Inkrementieren zeigt es auf "ist".

> printf kann ich wunderpar für PC-Programme verwenden weil da die
> Standartausgabe der Bildschirm ist, aber am mega128 ist kein Bildschirm
> dran, nur das weiss printf eben nicht ;-) .

Du kannst ihn aber z.B. über einen max232 an den seriellen Port des PCs 
anschließen und eine kleine Funktion schreiben, die dann von printf für 
die Ausgabe verwendet wird. Dazu mußt du allerdings weit genug sein, um 
das erstmal zustandezubringen.

> Vielleicht läßt sich die Erklärung ja auf ein etwas niedrigeres Niveau
> ausdehnen.

Ich würde sagen, du solltest erstmal bei der Programmierung auf dem PC 
bleiben, und erst wenn du C einigermaßen begriffen hast dann auf einen 
µC umsteigen, denn da ist alles noch eine Stufe komplizierter.

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

Bewertung
0 lesenswert
nicht lesenswert
Aber Hallo.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google-Anzeigen hat eben vollautomatisch erkannt, daß es hier um 
"Strings" geht.

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.