<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit strtok()]]></title><description><![CDATA[<p>Guten Abend zusammen,</p>
<p>ich bräuchte mal eure Hilfe.<br />
Und zwar bin ich gerade dabei einen Mikrocontroller zu programmieren, welcher eine Antwortzeichenfolge eines Servers auswertet. Diese sieht so aus:<br />
*112923450*20*21690**642867104857625465000000*0</p>
<p>Die beiden &quot;**&quot; sind kein Tippfehler.</p>
<p>Die Zeichenfolge liegt als String vor und soll nun auf die einzelnen Zahlenblöcke aufgeteilt werden. Diese sollen in einzelne chars oder ein String-Array kommen, das ist im Grunde egal.</p>
<p>Mein Ansatz war nun folgender:</p>
<pre><code>String werte[10];
(...)
Ausgabe.toCharArray(charBuf, 50);

        char *strpart = strtok(charBuf, &quot;*&quot;);
         int c=0; 

        while(strpart!=NULL) {
          for(int d=0; &amp;strpart[d]!=0; d++) {
            werte[c] += &amp;strpart[d];
          }
          c++;
          strpart=strtok(NULL, &quot;*&quot;);
        }
</code></pre>
<p>im String &quot;Ausgabe&quot; befindet sich die Ausgangszahlenfolge.</p>
<p>Der Compiler läuft anstandslos durch, der Mikrocontroller resettet sich jedoch immer kurz nach Verbindungsaufbau, was bedeutet, dass da irgendwo noch ein Haken drin ist.<br />
Kann mir jemand den Fehler nennen, oder sogar eine elegantere/bessere Möglichkeit, mein Vorhaben zu realisieren?</p>
<p>Vielen Dank schonmal, Gruß<br />
Julian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309872/problem-mit-strtok</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 01:52:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309872.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Oct 2012 17:42:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 17:42:49 GMT]]></title><description><![CDATA[<p>Guten Abend zusammen,</p>
<p>ich bräuchte mal eure Hilfe.<br />
Und zwar bin ich gerade dabei einen Mikrocontroller zu programmieren, welcher eine Antwortzeichenfolge eines Servers auswertet. Diese sieht so aus:<br />
*112923450*20*21690**642867104857625465000000*0</p>
<p>Die beiden &quot;**&quot; sind kein Tippfehler.</p>
<p>Die Zeichenfolge liegt als String vor und soll nun auf die einzelnen Zahlenblöcke aufgeteilt werden. Diese sollen in einzelne chars oder ein String-Array kommen, das ist im Grunde egal.</p>
<p>Mein Ansatz war nun folgender:</p>
<pre><code>String werte[10];
(...)
Ausgabe.toCharArray(charBuf, 50);

        char *strpart = strtok(charBuf, &quot;*&quot;);
         int c=0; 

        while(strpart!=NULL) {
          for(int d=0; &amp;strpart[d]!=0; d++) {
            werte[c] += &amp;strpart[d];
          }
          c++;
          strpart=strtok(NULL, &quot;*&quot;);
        }
</code></pre>
<p>im String &quot;Ausgabe&quot; befindet sich die Ausgangszahlenfolge.</p>
<p>Der Compiler läuft anstandslos durch, der Mikrocontroller resettet sich jedoch immer kurz nach Verbindungsaufbau, was bedeutet, dass da irgendwo noch ein Haken drin ist.<br />
Kann mir jemand den Fehler nennen, oder sogar eine elegantere/bessere Möglichkeit, mein Vorhaben zu realisieren?</p>
<p>Vielen Dank schonmal, Gruß<br />
Julian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265367</guid><dc:creator><![CDATA[Bananenbieger]]></dc:creator><pubDate>Mon, 29 Oct 2012 17:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 17:49:03 GMT]]></title><description><![CDATA[<p>Willst du C oder C++ machen? Kann man heute für uC schon C++ einsetzten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265368</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 29 Oct 2012 17:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 18:09:52 GMT]]></title><description><![CDATA[<p>Was ist hier denn ein &quot;String&quot;?</p>
<p>Was mir jedenfalls auffällt ist, dass du da irgendwie das Ergebnis eines Adressoperators so benutzt, als wäre es semantisch etwas anderes (keine Ahnung, was du dir dabei gedacht hast): <code>&amp;strpart[d]</code> .<br />
Lass mich raten: Irgendetwas hat nicht compiliert und du hast so lange zufällig Zeichen im Code eingefügt, bis es übersetzte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265371</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 29 Oct 2012 18:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 18:32:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">&amp;strpart[]
</code></pre>
<p>ist falsch und möchte (wenn überhaupt sinnvoll) gerne</p>
<pre><code class="language-cpp">strpart[]
</code></pre>
<p>heißen.<br />
Nimm sscanf, bei konstanter Zahl von auszuwertenden Teilen im Ausgangsstring sehr kurz:</p>
<pre><code class="language-cpp">char s[5][100];
if( 5==sscanf(&quot;*112923450*20*21690**642867104857625465000000*0&quot;,&quot;*%[^*]*%[^*]*%[^*]**%[^*]*%[^*]&quot;,s[0],s[1],s[2],s[3],s[4]) )
  puts(&quot;OK&quot;);
else
  puts(&quot;Fehler bei der Auswertung&quot;);
</code></pre>
<p>sscanf zerstört im Gegensatz zu strtok den Ausgangsstring nicht, der darf also auch const sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265374</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Mon, 29 Oct 2012 18:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 19:12:22 GMT]]></title><description><![CDATA[<p>Also erstmal vielen Dank an Wutz, der den Fehler ausfindig gemacht hat (ich bin heute irgendwie etwas neben der Spur, peinlicher Fehler...)!<br />
Die Konstruktion mit strtok() funktioniert jetzt, ich werde aber sscanf() verwenden - nochmals Danke für Tip und Erklärung.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Lass mich raten: Irgendetwas hat nicht compiliert und du hast so lange zufällig Zeichen im Code eingefügt, bis es übersetzte.</p>
</blockquote>
<p>Leider falsch geraten, s.o.<br />
Mir ist schon klar, dass der Dereferenzerierungsoperator sinnvoller gewesen wäre, wenn überhaupt, wirklich keine Ahnung, was ich mir dabei gedacht hatte...</p>
<p>out schrieb:</p>
<blockquote>
<p>Willst du C oder C++ machen? Kann man heute für uC schon C++ einsetzten?</p>
</blockquote>
<p>Und nochmal sorry, es handelt sich um schnödes C...</p>
<p>Meinen nächsten Beitrag verfasse ich mit klarem Kopf, versprochen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265388</guid><dc:creator><![CDATA[Bananenbieger]]></dc:creator><pubDate>Mon, 29 Oct 2012 19:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 20:01:19 GMT]]></title><description><![CDATA[<p>Was für ein uC ist das, für den du da codest? Wenn's um das Standard-AVR-Zeug geht, ist sscanf ziemlich bloatig (auf einen Schlag der halbe Progmem weg), und</p>
<pre><code class="language-cpp">char s[5][100];
</code></pre>
<p>kann man aus Speichergründen gleich vergessen (zumal du da ja Kopien ziehst). Auf uCs sind eierlegende Wollmilchsaufunktionen fast nie eine gute Idee. Ich würd bei strtok bleiben (und wenn mir der PM ausgeht, ne Minimallösung von Hand basteln).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265399</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 29 Oct 2012 20:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 20:08:09 GMT]]></title><description><![CDATA[<p>Also ich persönlich würde, gerade wenn das auf nem (vermutlich nicht sehr fett mit RAM und CPU Leistung ausgestatteten) Mikrocontroller laufen soll, einfach eine Schleife machen und die Teilstrings selbst auseinanderklauben.</p>
<p><code>sprintf</code> ist halt nicht gerade das schnellste Werkzeug unter der Sonne, und es zieht auch oft nen grossen Teil der Runtime-Library mit rein den man sonst vielleicht gar nicht braucht (heisst: das Image wird grösser).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265403</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 29 Oct 2012 20:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 20:24:03 GMT]]></title><description><![CDATA[<p>Und für deine for-Schleife kannst du <code>strncat</code> verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265407</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Mon, 29 Oct 2012 20:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 20:38:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>vermutlich nicht sehr fett mit RAM und CPU Leistung ausgestatteten</p>
</blockquote>
<p>Ich hab nen Robby mit Mikrocontroller. 2000 (!!!) Byte SRAM, 8Mhz CPU... <code>char[5][100]</code> ist da wohl schon vielleicht übertrieben. Aber ich denke, der Mikrocontroller vom TE dürfte vielleicht mehr haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265410</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 29 Oct 2012 20:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Mon, 29 Oct 2012 21:41:19 GMT]]></title><description><![CDATA[<p>DirkB schrieb:</p>
<blockquote>
<p>Und für deine for-Schleife kannst du <code>strncat</code> verwenden.</p>
</blockquote>
<p>Wüsste jetzt nicht wo man da <code>strncat</code> verwenden sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ich würde einfach Byteweise die Zeichen umschaufeln. Die Aufgabe ist so einfach, hier mit CRT Funktionen um sich zu werfen ist mMn. überhaupt nicht nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265431</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 29 Oct 2012 21:41:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Tue, 30 Oct 2012 00:25:56 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>vermutlich nicht sehr fett mit RAM und CPU Leistung ausgestatteten</p>
</blockquote>
<p>Ich hab nen Robby mit Mikrocontroller. 2000 (!!!) Byte SRAM, 8Mhz CPU... <code>char[5][100]</code> ist da wohl schon vielleicht übertrieben. Aber ich denke, der Mikrocontroller vom TE dürfte vielleicht mehr haben.</p>
</blockquote>
<p>Ganz im Ernst, 2KB sind für nen uC nicht besonders wenig. Die Dinger gehen <strong>ganz</strong> weit runter. Ein ATtiny4 hat 32 Byte -- nicht Kilobyte! Aber der hat auch nur 512 Byte Flash, von daher kann man da eh nichts großes machen.</p>
<p>Die größeren ATmegas gehen dann hoch bis 8KB, und die xmegas (glaub ich) bis 16, aber das ist dann schon echter Luxus (sprich: da muss man schon nen Zehner pro Stück hinlegen). Und auch da wirft man nicht eben mal ein halbes Kilobyte aus reiner Faulheit weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265453</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 30 Oct 2012 00:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Tue, 30 Oct 2012 05:54:07 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Ein ATtiny4 hat 32 Byte -- nicht Kilobyte!</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Wie groß ist dann erst der L1-Cache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265459</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 30 Oct 2012 05:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Tue, 30 Oct 2012 10:19:04 GMT]]></title><description><![CDATA[<p>Danke für das rege Feedback! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Beim uC handelt es sich um einen ATMEGA328, welcher mit 16MHz läuft und über 32KByte Progmem verfügt.<br />
Unter Verwendung von strtok sind etwas über 11KByte davon belegt, es wird aber vor Fertigstellung de Codes noch etwas dazukommen.</p>
<p>Nach meinem Posting gestern habe ich noch an einer Lösung, wie von hustbaer vorgeschlagen, gebastelt.<br />
Performancemäßig läuft die Variante mit strtok aber recht zügig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265525</guid><dc:creator><![CDATA[Bananenbieger]]></dc:creator><pubDate>Tue, 30 Oct 2012 10:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Tue, 30 Oct 2012 11:30:08 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Wie groß ist dann erst der L1-Cache?</p>
</blockquote>
<p>Witzbold.</p>
<p>Bananenbieger schrieb:</p>
<blockquote>
<p>Beim uC handelt es sich um einen ATMEGA328, welcher mit 16MHz läuft und über 32KByte Progmem verfügt.</p>
</blockquote>
<p>RAM hat der auch nur 2K. Allerdings kann man sich bei 32K Progmem wohl erlauben, ein paar Bibliotheksfunktionen da reinzulegen (abhängig davon, was du mit dem Ding eigentlich vorhast), und die strtok-Implementation in der avr-libc (ich geh mal davon aus, dass du avr-gcc benutzt) ist auch nicht besonders groß. Das sollte schon in Ordnung gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265557</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 30 Oct 2012 11:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit strtok() on Tue, 30 Oct 2012 12:31:07 GMT]]></title><description><![CDATA[<p><code>strtok</code> wird vermutlich noch gehen. <code>sscanf</code> wäre aber vermutlich etwas krass wenn man insgesamt nur 32K hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2265579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2265579</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Oct 2012 12:31:07 GMT</pubDate></item></channel></rss>