<?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[effiziente Möglichkeit Monatsname überprüfen]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie kann man sehr effizient überprüfen welcher Monat in der char-Variablen drinnensteht bzw. zuvor vom User eingegeben worden ist?</p>
<pre><code class="language-cpp">ParseMonth(char* pszToken, int&amp; nMonth))
{

  if (strcmp(pszToken, &quot;Jan&quot;) == 0)
    nMonth = 1; 
  else if(strcmp(pszToken, &quot;Feb&quot;) == 0)
    nMonth = 2;

//usw...
</code></pre>
<p>Wenn jetzt Dezember in pszToken gespeichert ist, müssten ja einige Abfragen getätigt werden; kann man das z.B. auch mit einem Switch() lösen?</p>
<p>Gruß<br />
Jakob</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268659/effiziente-möglichkeit-monatsname-überprüfen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 15:45:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268659.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jun 2010 13:04:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:04:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie kann man sehr effizient überprüfen welcher Monat in der char-Variablen drinnensteht bzw. zuvor vom User eingegeben worden ist?</p>
<pre><code class="language-cpp">ParseMonth(char* pszToken, int&amp; nMonth))
{

  if (strcmp(pszToken, &quot;Jan&quot;) == 0)
    nMonth = 1; 
  else if(strcmp(pszToken, &quot;Feb&quot;) == 0)
    nMonth = 2;

//usw...
</code></pre>
<p>Wenn jetzt Dezember in pszToken gespeichert ist, müssten ja einige Abfragen getätigt werden; kann man das z.B. auch mit einem Switch() lösen?</p>
<p>Gruß<br />
Jakob</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911196</guid><dc:creator><![CDATA[Jakob Hoffmann]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:09:40 GMT]]></title><description><![CDATA[<p>Sicher, einfach das erste Zeichen switchen und bei den mehrdeutigen Fällen auch noch das zweite und dritte überprüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911203</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:16:10 GMT]]></title><description><![CDATA[<p>Wenn du mit effizient gut lesbar meinst, kannst dus so machen:</p>
<pre><code class="language-cpp">void ParseMonth(char* pszToken, int&amp; nMonth)
{
	static const char* names[] = { &quot;Jan&quot;, &quot;Feb&quot;, &quot;Mar&quot; };

	for(int i = 0; i &lt; sizeof(names) / sizeof(names[0]); ++i)
		if(strcmp(names[i], pszToken) == 0)
		{
			nMonth = i+1;
			return;
		}
}
</code></pre>
<p>Die &quot;schönere&quot; Variante nimmt natürlich <code>std::string</code> .<br />
Wenn dir die Variante zu langsam ist, kannst du auch mit <code>std::map&lt;std::string, int&gt;</code> arbeiten, da kannst du mit O(log n) suchen. Bei 12 Einträgen ist der Geschwindigkeitsvorteil aber nicht messbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911207</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:20:14 GMT]]></title><description><![CDATA[<p>Sprichst du von Laufzeiteffizient oder Programmiereffizienz?<br />
Ich glaub selbst die dümmste und langsamste Implementierung, die ich mir vorstellen kann ist immer noch ne Mio. mal schneller als die Eingabe des Benutzers.<br />
Ich würde also eine für dich einfache, erweiterbare und wartbare Lösung suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911209</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:26:27 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Ich würde also eine für dich einfache, erweiterbare und wartbare Lösung suchen.</p>
</blockquote>
<p>Richtig. Wir müssen nämlich gut gerüstet sein, wenn der Dezember abegeschafft wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911215</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:33:03 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Ich würde also eine für dich einfache, erweiterbare und wartbare Lösung suchen.</p>
</blockquote>
<p>Richtig. Wir müssen nämlich gut gerüstet sein, wenn der Dezember abegeschafft wird.</p>
</blockquote>
<p>Vielleicht schreibt sich Dezember nach der nächsten Rechtschreibreform ja &quot;Detzember&quot;?<br />
Ein viel naheliegendes Szenario wäre allerdings der Wunsch, auch englische Monatsnamen zu akzeptieren. Oder 100 andere Sprachen. Das wird ein wunderschönes geswitche. Aber manchen macht sowas ja Spaß. <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/1911217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911217</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 13:41:27 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>Ich würde also eine für dich einfache, erweiterbare und wartbare Lösung suchen.</p>
</blockquote>
<p>Richtig. Wir müssen nämlich gut gerüstet sein, wenn der Dezember abegeschafft wird.</p>
</blockquote>
<p>Ich würde bei &quot;erweiterbar und wartbar&quot; jetzt eher an Sachen denken wie:</p>
<ul>
<li>Man möchte neben den Kurznamen auch auf Langnamen prüfen</li>
<li>Die Prüfung soll case-insensitiv sein</li>
<li>Das Programm wird übersetzt. Neben englischen Namen sollen auch deutsche, französische und chinesische akzeptiert werden</li>
<li>...</li>
</ul>
<p>Unter solchen Aspekten halte ich Implementierungen wie</p>
<pre><code class="language-cpp">int MonthNumer(const char *name)
{
    switch(name[0])
    {
        case 'J':    // Jan, Jun, Jul
            switch(name[1])
            {
                case 'a':
                    if(name[2] == 'n')
                        return 1;
                    break;
                case 'u':
                //...
            }
       //...
    }
}
</code></pre>
<p>fragwürdig.</p>
<p>Edit: ah, zu spät -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911218</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 12 Jun 2010 13:41:27 GMT</pubDate></item><item><title><![CDATA[Reply to effiziente Möglichkeit Monatsname überprüfen on Sat, 12 Jun 2010 15:23:21 GMT]]></title><description><![CDATA[<p>Ich benutze gern diese Art von Konstrukt:</p>
<pre><code class="language-cpp">#include &lt;map&gt;
#include &lt;stdexcept&gt;
#include &lt;string&gt;

namespace {
  class month_map {
  public:
    typedef std::map&lt;std::string, int&gt; map_t;

    month_map() {
      months_[&quot;Jan&quot;] = 1;
      months_[&quot;Feb&quot;] = 2;
      // ...
    }

    map_t::mapped_type operator()(std::string const &amp;m) const {
      map_t::const_iterator i = months_.find(m);
      if(i != months_.end()) {
        return i-&gt;second;
      }

      throw std::invalid_argument(&quot;Unbekannter Monat&quot;);
    }

  private:
    map_t months_;
  };

  month_map const month_parser;
}

int ParseMonth(std::string const &amp;name) {
  return month_parser(name);
}
</code></pre>
<p>...jedenfalls, wenn du ParseMonth nicht brauchst, bevor main beginnt. Gelegentlich sieht man so etwas auch mit einer statischen instance()-Funktion der Form</p>
<pre><code class="language-cpp">static month_map const &amp;instance() {
    static month_map me;
    return me;
  }
</code></pre>
<p>...das Problem damit ist aber, dass einige gebräuchliche Compiler (MSVC) diese Art der Initialisierung nicht threadsicher hinkriegen.</p>
<p>Wenn dir ein vernünftiger Hash einfällt, kann sich da auch std::tr1::unordered_map für anbieten - wobei wir hier von 12 Einträgen sprechen, was in einem herkömmlichen balancierten binären Baum (so ist eine std::map idR implementiert) ziemlich wenige Stringvergleiche bedeutet. Man müsste messen, ob unordered_map sich da lohnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911287</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 12 Jun 2010 15:23:21 GMT</pubDate></item></channel></rss>