<?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[Spezielle Auslese Frage...]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß nicht ob ich das hier posten soltle oder in einem allgemeinerem Forum (aber ich progge in C++ also denke ich ist es ok).</p>
<p>Also, ich habe einen String der einen Dateinamen ohne Endung repräsentiert (also einfach nur den Namen der Datei).</p>
<p>Der String besteht aus einem Namen und einem Suffix welcher aus Zahlen besteht. Bspw. so: Name000</p>
<p>Er kann aber auch so ausschauen Name.000 oder so Name_234 oder so Name0023</p>
<p>Die Frage ist nun, wie kann ich gezielt, lediglich die Zahlen *am Ende* des Strings herausfiltern?</p>
<p>Klar, ich könnte von hinten durch den String gehen und so lange überprüfen ob der momentane Wert einer Zahl zwischen 0-9 entspricht bis ein Buchstabe kommt, aber gibt es da eine elegantere Lösung direkt die Zahlen zu identifizieren?</p>
<p>Danke bereits im Vorraus für Tipps und Anregungen<br />
Desi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/145483/spezielle-auslese-frage</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 08:19:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145483.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Apr 2006 11:29:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 11:29:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß nicht ob ich das hier posten soltle oder in einem allgemeinerem Forum (aber ich progge in C++ also denke ich ist es ok).</p>
<p>Also, ich habe einen String der einen Dateinamen ohne Endung repräsentiert (also einfach nur den Namen der Datei).</p>
<p>Der String besteht aus einem Namen und einem Suffix welcher aus Zahlen besteht. Bspw. so: Name000</p>
<p>Er kann aber auch so ausschauen Name.000 oder so Name_234 oder so Name0023</p>
<p>Die Frage ist nun, wie kann ich gezielt, lediglich die Zahlen *am Ende* des Strings herausfiltern?</p>
<p>Klar, ich könnte von hinten durch den String gehen und so lange überprüfen ob der momentane Wert einer Zahl zwischen 0-9 entspricht bis ein Buchstabe kommt, aber gibt es da eine elegantere Lösung direkt die Zahlen zu identifizieren?</p>
<p>Danke bereits im Vorraus für Tipps und Anregungen<br />
Desi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047007</guid><dc:creator><![CDATA[Designer]]></dc:creator><pubDate>Fri, 28 Apr 2006 11:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 11:34:37 GMT]]></title><description><![CDATA[<p>du könntest z.B. den Algorithmus find_if() mit reverse-Iteratoren (rbegin(),rend()) über den String laufen lassen, um den ersten Buchstaben von hinten rauszusuchen - das Zeichen dahinter ist der Anfang des Suffixes.</p>
<p>(btw, reden wird hier über std::string oder über char*? Im letzteren Fall solltest du über einen Umstieg nachdenken)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047016</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 28 Apr 2006 11:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 11:34:41 GMT]]></title><description><![CDATA[<p>Ich würd mal sagen das ist die eleganteste lösung.<br />
In ner schleife überprüfen und zahl herausfiltern.<br />
Ich glaube nicht das es bereits eine funktion für genau diese aufgabe gibt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047017</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Fri, 28 Apr 2006 11:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 11:37:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke euch beiden für eure Antworten. Dann mach ich es so.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Es ist eine eigene String implementation, die aber der std::string klasse eher ähnelt. (Und wenn würde ich auch eher die std::string verwenden) <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>
<p>Vielen Dank!<br />
Gruß<br />
Desi</p>
<p>P.S.: Falls jemand noch Lösungsansätze kennt, bin ich nicht abgeneigt diese zu hören/lesen <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/1047019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047019</guid><dc:creator><![CDATA[Designer]]></dc:creator><pubDate>Fri, 28 Apr 2006 11:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 13:07:20 GMT]]></title><description><![CDATA[<p>Designer schrieb:</p>
<blockquote>
<p>P.S.: Falls jemand noch Lösungsansätze kennt, bin ich nicht abgeneigt diese zu hören/lesen <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>
</blockquote>
<p>Es wird dir nichts übrig bleiben als tatsächlich nachzusehen bis wohin die Zahl geht.<br />
Du könntest höchstens, falls du sie auch als int benötigst, sofort konvertieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047082</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 28 Apr 2006 13:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 13:28:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich glaube nicht das es bereits eine funktion für genau diese aufgabe gibt</p>
</blockquote>
<p>Anscheinend hast du dich noch nicht mit der STL und der generischen Programmierung beschäftigt!? <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="🙂"
    /> Genauso wie die Container der STL wie z.B. der Vector auf beliebigen Datentypen operiert, lassen sich die Algorithmen mit verschiedenen Parametern aufrufen. Hierbei werden Funktionsobjekte übergeben. So lässt sich die Funktion find_if mit verschiedenen Prädikaten aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047092</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Apr 2006 13:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 13:54:44 GMT]]></title><description><![CDATA[<p>Im Prinzip sehe Ich hier auch keine andere Lösung als die bereits vorgeschlagene. Die Frage ist evt. wie setzt man das um?<br />
In C++ gibt es genau eine empfohlene Methode, um aus einer Folge von Zeichen eine Zahl zu lesen; und das ist std::istream &gt;&gt; int<br />
Die Zeichen stehen in einem String, müssen aber erst gesucht werdem. Hört sich nach find_if und Iteratoren an - wie von CStoll schon beschrieben.</p>
<p>Verbindet man beides konsequent miteinander, so kommt zwangsläufig so etwas heraus</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;streambuf&gt;
#include &lt;algorithm&gt;  // find_if
#include &lt;string&gt;
#include &lt;functional&gt; // not1, ptr_fun
#include &lt;cctype&gt;  // isdigit

template&lt; typename I &gt;
class IIterStreambuf : public std::streambuf
{
public:
    typedef std::streambuf base_type;
    typedef base_type::traits_type traits_type;
    typedef base_type::int_type int_type;

    IIterStreambuf( I first, I last )
        : base_type()
        , m_c()
        , m_cur( first )
        , m_last( last )
    {}

protected:
    virtual int_type underflow()
    {
        if( m_cur != m_last )
        {
            m_c = *m_cur++;
            setg( &amp;m_c, &amp;m_c, &amp;m_c + 1 );
            return traits_type::to_int_type( m_c );
        }
        return traits_type::eof();
    }

private:
    char m_c;
    I m_cur;
    I m_last;
};

class IIterStream : public std::istream
{
public:
    typedef std::istream base_type;
    template&lt; typename IIter &gt;
        IIterStream( IIter first, IIter last )
        : base_type( new IIterStreambuf&lt; IIter &gt;( first, last ) )
    {}
    ~IIterStream() { delete rdbuf(); }
private:
    IIterStream( const IIterStream&amp; );
    IIterStream&amp; operator=( const IIterStream&amp; );
};
</code></pre>
<p>Mal wieder ist es so, dass es in C++ zwar nicht für alles DIE Funktion gibt, die man benötigt, aber es läßt sich oft etwas mit wenigen Zeilen zusammenstellen.</p>
<p>Die Anwendung dieses IIterStream's für das von Designer beschriebene Problem geht dann wie folgt</p>
<pre><code class="language-cpp">void test_test( const std::string&amp; txt )
{
    using namespace std;
    cout &lt;&lt; &quot;\&quot;&quot; &lt;&lt; txt &lt;&lt; &quot;\&quot;  - &quot;;
    IIterStream in( find_if( txt.rbegin(), txt.rend(), not1( ptr_fun( &amp;isdigit ) ) ).base(), txt.end() );
    int i; 
    if( in &gt;&gt; i )
        cout &lt;&lt; &quot;Nr. = &quot; &lt;&lt; i &lt;&lt; endl;
    else 
        cout &lt;&lt; &quot;keine Zahl am Ende enthalten&quot; &lt;&lt; endl;
}

int main()
{
    const char* txt[] = { &quot;Name_0123&quot;, &quot;DateiOhne&quot;, &quot;&quot;, &quot;Name_0123.xxx&quot;, &quot;Datei0&quot; };
    std::for_each( txt, txt + sizeof( txt )/sizeof(*txt), &amp;test_test );
    return 0;
}
</code></pre>
<p>.. ob das jetzt 'elegant' ist, mögen andere beurteilen</p>
<p>Gruß<br />
Werner</p>
<p>@Edit underflow: to_char_type durch to_int_type ersetzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047098</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 13:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 14:53:00 GMT]]></title><description><![CDATA[<p>ein wenig umständlich oder? <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="😉"
    /> schau dir mal folgende lösung an <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="🙂"
    /> die kommentare lassen den quelltext ein wenig aufquellen ...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;iterator&gt;

using namespace std;

/**
 * Prädikat liefert wahr wenn es sich bei dem übergebenen Zeichen um
 * eine Zahl handel
 **/

struct is_num : unary_function&lt;char, bool&gt;
{

  /**
   * @param x Zeichen dessen Wert überprüft werden soll
   **/

  bool operator()(char x) const
  {
    return isdigit(x);
  }

};

int main()
{
  string str = &quot;test123&quot;;

  /**
   * Erstes Vorkommen eines Zeichen welches keine Zahl ist
   * ermitteln. Hierzu oben definiertes Funktionsobjekt is_num
   * negieren
   **/  
  reverse_iterator&lt;string::iterator&gt; i= find_if(str.rbegin(),
  str.rend(), not1(is_num()));

  /**
   * nun kann bequem per Iterator auf das Ergebnis zugegriffen
   * werden. Z.B. lässt sich das Ergebnis mit folgendem Befehl auf die
   * Standardausgabe schreiben. Natüröich kann auch jeder andere
   * beliebige ostream verwendet werden
   **/
  copy(i.base(), str.end(), ostream_iterator&lt;char&gt;(cout));

  /**
   * ... oder das Ergebnis kann per stringstream in ein Zahlentyp
   * umgewandelt werden
   **/
  stringstream tmp;
  copy(i.base(), str.end(), ostream_iterator&lt;char&gt;(tmp));

  int n;
  tmp &gt;&gt; n;

  cout &lt;&lt; n;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1047143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047143</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Apr 2006 14:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 14:58:10 GMT]]></title><description><![CDATA[<p>anstatt das Prädikat selbst zu definieren kannst du natürlich auch ptr_fun(&amp;isdigit) verwenden funktioniert auch. <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/1047148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047148</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Apr 2006 14:58:10 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 15:54:58 GMT]]></title><description><![CDATA[<p>Und mit &quot;i.base()-str.begin()&quot; kannst du den Index des Zahlenblocks bestimmen und diesen z.B. per substr() raustrennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047174</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 28 Apr 2006 15:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 19:53:38 GMT]]></title><description><![CDATA[<p>@lucky_tux guter Vorschlag <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>da setze ich jetzt noch einen drauf. Allerdings mit einer Anleihe bei boost</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;    // find_if
#include &lt;string&gt;
#include &lt;functional&gt;   // not1, ptr_fun
#include &lt;cctype&gt;       // isdigit 
#include &lt;boost/lexical_cast.hpp&gt; // wer boost nicht kennt, hat C++ verpennt  :sunglasses: 

void test_test( const std::string&amp; txt )
{
    using namespace std;
    cout &lt;&lt; &quot;\&quot;&quot; &lt;&lt; txt &lt;&lt; &quot;\&quot;  - Nr. = &quot; &lt;&lt; 
        boost::lexical_cast&lt; int &gt;( string( find_if( txt.rbegin(), txt.rend(), not1( ptr_fun( &amp;isdigit ) ) ).base(), txt.end() ) ) 
        &lt;&lt; endl;
}

int main()
{
    const char* txt[] = { &quot;Name_0123&quot;, &quot;Datei33&quot;, &quot;567&quot;, &quot;Datei0&quot;, &quot;NameOhneZahl&quot; };
    try
    {
        std::for_each( txt, txt + sizeof( txt )/sizeof(*txt), &amp;test_test );
    }
    catch( const std::exception&amp; err )
    {
        using namespace std;
        cerr &lt;&lt; &quot;\nUups: &quot; &lt;&lt; err.what() &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>langsam könnte sich Designer mal wieder melden; er war doch an weiteren Lösungen interessiert....</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047350</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 19:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 20:09:00 GMT]]></title><description><![CDATA[<p>Hm.. sieht immer noch alles ziemlich nach CStolls Lösung aus, cf Post #2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047356</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 20:17:54 GMT]]></title><description><![CDATA[<p>finix schrieb:</p>
<blockquote>
<p>Hm.. sieht immer noch alles ziemlich nach CStolls Lösung aus, cf Post #2.</p>
</blockquote>
<p>Hat ja auch keiner gesagt, dass das grundsätzlich neu wäre</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Im Prinzip sehe Ich hier auch keine andere Lösung als die bereits vorgeschlagene. Die Frage ist evt. wie setzt man das um?</p>
</blockquote>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1047362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047362</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 28 Apr 2006 20:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to Spezielle Auslese Frage... on Fri, 28 Apr 2006 21:48:15 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Hat ja auch keiner gesagt, dass das grundsätzlich neu wäre</p>
</blockquote>
<p>Hab ja auch nur angemerkt dass noch keine grundsätzlich neue Lösung aufgetaucht ist <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/1047419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1047419</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Fri, 28 Apr 2006 21:48:15 GMT</pubDate></item></channel></rss>