<?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[Unzufrieden mit Funktion (Strings)]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte mal eine Funktion schreiben, die mir die Befehle in einer HL2-Config Datei durchließt, zählt und einzeln ausgibt.</p>
<p>In so einer Datei könnte z. B. soetwas stehen:</p>
<pre><code>var xxx 4 ; bind &quot;xxx&quot; &quot;hallo&quot; ; echo &quot;hallo ; du da&quot;
</code></pre>
<p>Befehle mit Argumenten können durch ein &quot;;&quot; getrennt werden, jedoch nur, wenn diese sich <strong>nicht</strong> in einem String befinden.</p>
<p>Soweit sogut. Daraufhin hab ich mal diese Funktion geschrieben:</p>
<pre><code class="language-cpp">void count_commands (const std::basic_string&lt;TCHAR&gt;&amp; value)
{
    bool in_string = false;

    for (unsigned long i = 0, position = 0, count = 0; i &lt; value.size (); ++i)
    {
        if (value[i] == _T ('\&quot;'))
            in_string ^= true;

        if (value[i] == _T (';') &amp;&amp; in_string)
            continue;

        if (value[i] == _T (';') || i == value.size () - 1)
        {
            if (i == value.size () - 1)
                ++i;

            std::wcout &lt;&lt; count++ &lt;&lt; _T (&quot;: &quot;) &lt;&lt; value.substr (position, i - position) &lt;&lt; std::endl;
            position = i + 1;
        }
    }
}
</code></pre>
<p>Die Funktion läuft erste Sahne, jedoch gefällt sie mir nicht besonders. Vorallem das letzte if, wo ich mit value.size () - 1 das 'i' abfrage, damit er nicht den letzten Befehl auslässt. Auch das letzte if wo ich 'i' inkrementiere gefällt mir nicht so recht, aber wenn ich es weglasse, wird das letzte Zeichen übersprungen.</p>
<p>Kennt da jemand eine &quot;bessere&quot; bzw. &quot;schönere&quot; Lösung?</p>
<p>Hier noch meine Main-Funktion.</p>
<pre><code class="language-cpp">int main (void)
{
    count_commands (_T (&quot;var xxx 4 ; bind \&quot;xxx\&quot; \&quot;hallo\&quot; ;echo \&quot;hallo ; du da\&quot;&quot;));
}
</code></pre>
<p>Danke im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180736/unzufrieden-mit-funktion-strings</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 22:34:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180736.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 May 2007 21:07:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unzufrieden mit Funktion (Strings) on Sat, 05 May 2007 21:07:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte mal eine Funktion schreiben, die mir die Befehle in einer HL2-Config Datei durchließt, zählt und einzeln ausgibt.</p>
<p>In so einer Datei könnte z. B. soetwas stehen:</p>
<pre><code>var xxx 4 ; bind &quot;xxx&quot; &quot;hallo&quot; ; echo &quot;hallo ; du da&quot;
</code></pre>
<p>Befehle mit Argumenten können durch ein &quot;;&quot; getrennt werden, jedoch nur, wenn diese sich <strong>nicht</strong> in einem String befinden.</p>
<p>Soweit sogut. Daraufhin hab ich mal diese Funktion geschrieben:</p>
<pre><code class="language-cpp">void count_commands (const std::basic_string&lt;TCHAR&gt;&amp; value)
{
    bool in_string = false;

    for (unsigned long i = 0, position = 0, count = 0; i &lt; value.size (); ++i)
    {
        if (value[i] == _T ('\&quot;'))
            in_string ^= true;

        if (value[i] == _T (';') &amp;&amp; in_string)
            continue;

        if (value[i] == _T (';') || i == value.size () - 1)
        {
            if (i == value.size () - 1)
                ++i;

            std::wcout &lt;&lt; count++ &lt;&lt; _T (&quot;: &quot;) &lt;&lt; value.substr (position, i - position) &lt;&lt; std::endl;
            position = i + 1;
        }
    }
}
</code></pre>
<p>Die Funktion läuft erste Sahne, jedoch gefällt sie mir nicht besonders. Vorallem das letzte if, wo ich mit value.size () - 1 das 'i' abfrage, damit er nicht den letzten Befehl auslässt. Auch das letzte if wo ich 'i' inkrementiere gefällt mir nicht so recht, aber wenn ich es weglasse, wird das letzte Zeichen übersprungen.</p>
<p>Kennt da jemand eine &quot;bessere&quot; bzw. &quot;schönere&quot; Lösung?</p>
<p>Hier noch meine Main-Funktion.</p>
<pre><code class="language-cpp">int main (void)
{
    count_commands (_T (&quot;var xxx 4 ; bind \&quot;xxx\&quot; \&quot;hallo\&quot; ;echo \&quot;hallo ; du da\&quot;&quot;));
}
</code></pre>
<p>Danke im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279495</guid><dc:creator><![CDATA[HL2ler]]></dc:creator><pubDate>Sat, 05 May 2007 21:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Unzufrieden mit Funktion (Strings) on Sat, 05 May 2007 21:57:47 GMT]]></title><description><![CDATA[<p>boost::tokenizer kann soweit ich weiß auch mit Anführungszeichen umgehen.<br />
Dann musst du nur noch den tokenizer mit dem string füttern (bei ; spliten) und du bekommst viele einzelne kommandos zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279502</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 05 May 2007 21:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to Unzufrieden mit Funktion (Strings) on Sat, 05 May 2007 22:04:57 GMT]]></title><description><![CDATA[<p>Wollte eigentlich nicht extra auf Zusatzlibs zurückgreifen, sondern eher nur die STL benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279503</guid><dc:creator><![CDATA[HL2ler]]></dc:creator><pubDate>Sat, 05 May 2007 22:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to Unzufrieden mit Funktion (Strings) on Sat, 05 May 2007 22:17:35 GMT]]></title><description><![CDATA[<p>hm.. ich versuch ma was ausm stehgreif</p>
<pre><code class="language-cpp">int count_commands(const string&amp; command)
{
  int num = 0;
  for(int i = 0; i &lt; command.size(); i++)
  {
    char c = command[i];
    if(c == '\&quot;')
    {
      size_t f = command.find('\&quot;', i+1);
      if(f == command.npos)
        throw std::runtime_error(&quot;Fehlerhaftes Kommando!&quot;) // es fehlt passendes gegenstück zu &quot;
      i = f;
    }
    else if(c == ';') // ; außerhalb von &quot;&quot;
      num++;
  }

  return num;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279504</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 05 May 2007 22:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to Unzufrieden mit Funktion (Strings) on Sat, 05 May 2007 23:25:11 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct command_counter
{
    command_counter() : s_(), in_string_( false ), count_( 0 ) {}
    int print()
    {
        if ( !in_string_ &amp;&amp; !s_.empty() )
        {
            std::wcout &lt;&lt; count_++ &lt;&lt; L&quot;: &quot; &lt;&lt; s_ &lt;&lt; std::endl;
            s_.clear();
        }
        return count_;
    }
    void operator()(wchar_t c)
    {
        if ( !in_string_ &amp;&amp; c == L';' )
            print();
        else
        {
            in_string_ = in_string_ == ( c != L'\&quot;' );
            s_.push_back( c );
        }
    }
    std::string s_:
    bool in_string_;
    int count_;
};
int count_commands(const std::wstring&amp; value)
{
    return std::for_each( value.begin(), value.end(), command_counter() ).print();
}
</code></pre>
<p>ist eigentlich auch nicht besser...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279513</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 05 May 2007 23:25:11 GMT</pubDate></item></channel></rss>