<?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[Newbie: Vernünftiger Umgang mit Strings?]]></title><description><![CDATA[<p>Hi,</p>
<p>wie steige ich am besten in das Thema Strings ein? Ich finde Strings in c++ wirklich merkwürdig gelöst, wenn ich mal mit Delphi vergleiche. Was ich in Delphi out of the box an Stringfunktionen hatte, muss ich mir in c++ in Bibliotheken zusammensammeln und überschreite da oft auch noch Grenzen von Datentypen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Der Einstieg ist echt hart, erste Ergebnisse lassen ganz schön auf sich warten...</p>
<p>Ich will Strings der Länge &lt;300 in Variablen schreiben. Erst dachte ich, es sei eine gute Idee, die string-Klasse zu Hilfe zu nehmen, diese scheint mir intuitiver zu sein. Jetzt will ich aber ganz natürliche Operationen darauf machen, wie zum Beispiel tolower(). Das bekomme ich aber nicht auf meine String-Variable angewandt. Wie wende ich es an?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
int main(void)
{string test = &quot;Max&quot;;}
</code></pre>
<p>Also tolower(test) ist schon mal nicht erlaubt. (Ja, ich hatte das included). Ist &quot;Variable&quot; überhaupt der richtige Begriff? Oder sagt man hier &quot;test&quot; ist ein Objekt der Klasse &quot;string&quot;. Dann folgt doch für mich daraus, ich kann nur Methoden des Objekts aufrufen? Also in meinem Fall brauche ich eine Lowercase-Funktion, ich würde dann, falls es das geben würde, test.tolower aufrufen? Bin ich für OOP zu alt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Ich glaube mein Problem ist, ich komme total mit Klassen, Funktionen, Konstruktoren, Methoden durcheinander.</p>
<p>Was würdet Ihr im konkreten Fall (Variable und eine Lowercase-Funktion) raten?</p>
<p>Danke, ich hoffe ich nerve nicht zu sehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/253762/newbie-vernünftiger-umgang-mit-strings</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 11:44:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/253762.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Nov 2009 10:37:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:41:07 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie steige ich am besten in das Thema Strings ein? Ich finde Strings in c++ wirklich merkwürdig gelöst, wenn ich mal mit Delphi vergleiche. Was ich in Delphi out of the box an Stringfunktionen hatte, muss ich mir in c++ in Bibliotheken zusammensammeln und überschreite da oft auch noch Grenzen von Datentypen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Der Einstieg ist echt hart, erste Ergebnisse lassen ganz schön auf sich warten...</p>
<p>Ich will Strings der Länge &lt;300 in Variablen schreiben. Erst dachte ich, es sei eine gute Idee, die string-Klasse zu Hilfe zu nehmen, diese scheint mir intuitiver zu sein. Jetzt will ich aber ganz natürliche Operationen darauf machen, wie zum Beispiel tolower(). Das bekomme ich aber nicht auf meine String-Variable angewandt. Wie wende ich es an?</p>
<pre><code class="language-cpp">#include &lt;string&gt;
int main(void)
{string test = &quot;Max&quot;;}
</code></pre>
<p>Also tolower(test) ist schon mal nicht erlaubt. (Ja, ich hatte das included). Ist &quot;Variable&quot; überhaupt der richtige Begriff? Oder sagt man hier &quot;test&quot; ist ein Objekt der Klasse &quot;string&quot;. Dann folgt doch für mich daraus, ich kann nur Methoden des Objekts aufrufen? Also in meinem Fall brauche ich eine Lowercase-Funktion, ich würde dann, falls es das geben würde, test.tolower aufrufen? Bin ich für OOP zu alt? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Ich glaube mein Problem ist, ich komme total mit Klassen, Funktionen, Konstruktoren, Methoden durcheinander.</p>
<p>Was würdet Ihr im konkreten Fall (Variable und eine Lowercase-Funktion) raten?</p>
<p>Danke, ich hoffe ich nerve nicht zu sehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804280</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:41:07 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:48:32 GMT]]></title><description><![CDATA[<p>mit c_str() kannst du dir ein char* ausgeben lassen<br />
<a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
<pre><code class="language-cpp">test.c_str()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1804286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804286</guid><dc:creator><![CDATA[Bigmek]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:49:15 GMT]]></title><description><![CDATA[<p>Die Lösung für deine Probleme heißt <em><strong>Boost</strong></em>.<br />
<a href="http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804288</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:55:26 GMT]]></title><description><![CDATA[<p><strong>€dit: Verpeilt</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804289</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:55:26 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:50:57 GMT]]></title><description><![CDATA[<p>Die String-Klassen sind auf jeden Fall sehr nützlich und erstmal der richtige Schritt. Du wirst aber nicht darum herum kommen, dich mit der Standard-Bibliothek von C++ auseinander setzen zu müssen, um zu wissen, wo du was findest und anwendest. D.h. du solltest dir folgendes anschauen:</p>
<p>- Die Memberfunctions (Methoden) von basic_string: <a href="http://www.cplusplus.com/reference/string/string/" rel="nofollow">http://www.cplusplus.com/reference/string/string/</a><br />
- Die Algorithmen <a href="http://www.cplusplus.com/reference/algorithm/" rel="nofollow">http://www.cplusplus.com/reference/algorithm/</a> lassen sich auch auf String-Objekte anwenden, da ein String auch nur ein Container sit.<br />
- Die Stringstreams, sind zum Formatieren und Umwandeln (z.B. von Zahl zu Zeichenkette) sehr nützlich.</p>
<p>Leider ist die Std-Lib von C++ wirklich nicht der König in Sachen String-Manipulation. Wenn du viel mit Strings arbeitest, solltest du dir <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html</a> anschauen. Die haben dort sehr viel, auch was für dich: <a href="http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo/usage.html#id1685354" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo/usage.html#id1685354</a></p>
<p>Überhaupt gehört Boost auf jeden Rechner eines C++-Proggers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804291</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:50:57 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 13 Nov 2010 16:46:53 GMT]]></title><description><![CDATA[<p>sunny31 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;cctype&gt;
#include &lt;iostream&gt;
int main()
{
    std::string test = &quot;MAX&quot;;
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: MAX
    test = std::tolower(test);
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: max
    return 0;
}
</code></pre>
</blockquote>
<p>Also das kann ich mir beim besten Willen nicht vorstellen...<br />
Soweit ich weiß erwartet <code>std::tolower()</code> einen <code>int</code> als Argument...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804294</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 13 Nov 2010 16:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 13 Nov 2010 16:46:45 GMT]]></title><description><![CDATA[<p>sunny31 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">test = std::tolower(test);
</code></pre>
<p>Ich hoffe, dass mein Beispiel funktioniert. Habe momentan kein Compiler bei mir rumliegen um das zu testen...</p>
</blockquote>
<p>Genau das war mein Problem. Das tolower() da oben scheint nicht erlaubt zu sein...</p>
<p>&quot;error: cannot convert `std::string' to `int' for argument `1' to `int tolower(int)'&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804295</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Sat, 13 Nov 2010 16:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:02:04 GMT]]></title><description><![CDATA[<p>Ja du hast recht...</p>
<p>richtig wäre es so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cctype&gt;

int main()
{
    std::string test = &quot;MAX&quot;;
    for ( unsigned int i=0; i &lt; test.size(); i++ )
           test[i]=std::tolower(test[i]);
    std::cout &lt;&lt; test &lt;&lt; std::endl;   //max
}
</code></pre>
<p>Wobei, es sicher bessere Lösungen dafür gibt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804296</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 10:58:50 GMT]]></title><description><![CDATA[<p>versuchs mal so</p>
<pre><code class="language-cpp">string test=&quot;Test String&quot;;
for (int i=0;i&lt;test.length();i++) test[i]=tolower(test[i]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1804297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804297</guid><dc:creator><![CDATA[Bigmek]]></dc:creator><pubDate>Fri, 06 Nov 2009 10:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 13 Nov 2010 16:46:35 GMT]]></title><description><![CDATA[<p>sunny31 schrieb:</p>
<blockquote>
<p>funktioniert die ToLower Funktion so:</p>
<pre><code class="language-cpp">#include &lt;cctype&gt;
#include &lt;iostream&gt;
int main()
{
    std::string test = &quot;MAX&quot;;
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: MAX
    test = std::tolower(test);
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: max
    return 0;
}
</code></pre>
<p>Ich hoffe, dass mein Beispiel funktioniert. Habe momentan kein Compiler bei mir rumliegen um das zu testen...</p>
</blockquote>
<p>Habe es auch nicht ausprobiert, aber 1. ist es eine C-Funktion (nichts C++-artiges) und 2. konvertiert es nur einen einzelnen Charachter und keine Zeichenkette.<br />
Es ist sowieso blödsinnig jemanden mit C-Krüppelfunktionen anzukommen, wenn er C++ machen will. Weil man hier eigentlich eine for-Schleife bauen müsste:</p>
<pre><code class="language-cpp">#include &lt;cctype&gt;
#include &lt;iostream&gt;
int main()
{
    std::string test = &quot;MAX&quot;;
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: MAX
    for(size_t i = 0; i&lt;test.size(); i++)
          test[i] = std::tolower(test[i]);
    std::cout &lt;&lt; test &lt;&lt; std::endl; // Ausgabe: max
    return 0;
}
</code></pre>
<p>Aber sowas findet man fertig in der Boost-String-Algo-Lib.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804298</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sat, 13 Nov 2010 16:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:08:07 GMT]]></title><description><![CDATA[<p>So, wenn man kein Boost nutzen will:</p>
<pre><code class="language-cpp">#include &lt;cctype&gt;

void to_lower(string &amp;str)
{
    for(size_t i = 0; i&lt;str.size(); ++i)
          str[i] = std::tolower(str[i]);
}
</code></pre>
<p>Aber Boost ist hier eindeutig lohnenswert, da es nicht nur mit std::string zusammen arbeitet und auch die Locale beachtet!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804302</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:10:23 GMT]]></title><description><![CDATA[<p>Dafür kann man aber die Funktion 'std::transform' benutzen, jedoch gibt es dabei auch ein paar Fallstricke (je nach Compiler) zu beachten, s. <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-210176-and-highlight-is-transform+tolower.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-210176-and-highlight-is-transform+tolower.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804304</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:15:07 GMT]]></title><description><![CDATA[<p>Danke allerseits... Zwischenfazit bzgl. Lowercase/Uppercase: Rein auf STL-Ebene macht man es wohl tatsächlich selbst, also eine Schleife über ein Char-Array...<br />
Zwischenfazit2: Boost muß her. Ich will nämlich langsam Ergebnisse sehen. Und damit den Ansporn aufbauen, mich dann auch Standard-näher schlau zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804308</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:29:48 GMT]]></title><description><![CDATA[<p>Ich habe mal eine Nachfrage. Das ist aus boosts &quot;to_lower&quot; (boost::algorithm::to_lower). Ich habe oft Probleme, die Funktionenbeschreibungen zu verstehen. Ich weiß dann nicht, welche Argumente von welchem Typ verlangt werden und wie die Rückgabe aussieht...</p>
<p>[<a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost/algorithm/to_lower.html" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost/algorithm/to_lower.html</a>]</p>
<pre><code class="language-cpp">void to_lower(WritableRangeT &amp; Input, 
                const std::locale &amp; Loc = std::locale());
</code></pre>
<p>&quot;void to_lower&quot;. OK, void sagt mir AFAIK &quot;keine Rückgabe&quot;. Die Funktion ändert den String direkt. In der Klammer sollte m.E. das Argument stehen. Nur was heißt das darin? Kann mir das jemand erklären? Ich sehe ein Komma, würde also 2 Argumente vermuten. Aber warum 2?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804324</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:29:48 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:41:42 GMT]]></title><description><![CDATA[<p>Man sollte auch nicht unbedingt <code>tolower</code> aus <code>&lt;ctype&gt;</code> benutzen, sondern besser <code>tolower</code> aus <code>&lt;locale&gt;</code> .<br />
Irgendwie so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;locale&gt;

template&lt;typename charT&gt;
class ToLower
{
public:
    ToLower(char const * locale = &quot;&quot;)
        : loc(locale)
    { }
    charT operator()(charT c){ return std::tolower(c, loc); }
private:
    std::locale loc;
};

int main()
{
    std::string hallo = &quot;haLLo wELt&quot;;
    std::transform(hallo.begin(), hallo.end(), hallo.begin(), ToLower&lt;std::string::value_type&gt;());
    std::cout &lt;&lt; hallo &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1804326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804326</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:41:42 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 11:37:41 GMT]]></title><description><![CDATA[<blockquote>
<p>#include &lt;algorithm&gt;<br />
#include &lt;string&gt;</p>
<p>std::string test = &quot;THIS IS MY STRING&quot;;<br />
std::transform(test.begin(), test.end(), test.begin(), std::tolower);</p>
</blockquote>
<p>So gehts wohl am besten und am schönsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804335</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Fri, 06 Nov 2009 11:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 13:55:19 GMT]]></title><description><![CDATA[<p>Squeller schrieb:</p>
<blockquote>
<p>&quot;void to_lower&quot;. OK, void sagt mir AFAIK &quot;keine Rückgabe&quot;. Die Funktion ändert den String direkt.</p>
</blockquote>
<p>Ja. Wenn du eine Kopie haben willst, schau dir <code>to_lower_copy()</code> an.</p>
<p>Squeller schrieb:</p>
<blockquote>
<p>In der Klammer sollte m.E. das Argument stehen. Nur was heißt das darin? Kann mir das jemand erklären? Ich sehe ein Komma, würde also 2 Argumente vermuten. Aber warum 2?</p>
</blockquote>
<p>Das erste für den zu bearbeitenden String und das zweite für das Locale. Das Locale bestimmt zum Beispiel, welche speziellen Zeichen berücksichtigt werden, also <code>'ä'</code> in der deutschen und 'é' in der französischen Sprache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804407</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 06 Nov 2009 13:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Fri, 06 Nov 2009 20:54:43 GMT]]></title><description><![CDATA[<p>Squeller schrieb:</p>
<blockquote>
<p>[<a href="http://www.boost.org/doc/libs/1_40_0/doc/html/boost/algorithm/to_lower.html" rel="nofollow">http://www.boost.org/doc/libs/1_40_0/doc/html/boost/algorithm/to_lower.html</a>]</p>
<pre><code class="language-cpp">void to_lower(WritableRangeT &amp; Input, 
                const std::locale &amp; Loc = std::locale());
</code></pre>
<p>&quot;void to_lower&quot;. OK, void sagt mir AFAIK &quot;keine Rückgabe&quot;. Die Funktion ändert den String direkt. In der Klammer sollte m.E. das Argument stehen. Nur was heißt das darin? Kann mir das jemand erklären? Ich sehe ein Komma, würde also 2 Argumente vermuten. Aber warum 2?</p>
</blockquote>
<p>Unter Description stehen ja die Bedeutungen der einzelnen Parameter:</p>
<p><em><strong>Input</strong> A range<br />
<strong>Loc</strong> a locale used for conversion</em></p>
<p>Wobei du den zweiten Wert nicht explizit angeben mußt, weil der zweite Parameter einen Default-Wert vorgibt:</p>
<p>void to_lower(WritableRangeT &amp; Input, const std::locale &amp; Loc = std::locale());</p>
<p>Nur wenn dir der Default-Wert <code>std::locale()</code> nicht zusagt, gibst du beim Aufruf einen anderen an. In den meisten Fällen dürfte aber <code>std::locale()</code> i.O. sein, da sich dieses nach den Betriebssystem-Einstellungen richtet. Was die Locale ist, weißt Du? Das hat was mit den Zeichencodes für verschiedene Länder und Sprachen zu tun, siehe hier:</p>
<p><a href="http://www.cplusplus.com/reference/std/locale/" rel="nofollow">http://www.cplusplus.com/reference/std/locale/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804632</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 06 Nov 2009 20:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 07 Nov 2009 10:18:58 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort.</p>
<p>Nein, was eine locale ist, habe ich auch nur erahnt... Wie ist das &quot;&amp;&quot; zu verstehen? Hat das was mit Standardwerten zu tun? Mein Problem ist wohl die Komplexität des Ausdrucks. Wenn da jetzt stünde &quot;void ziehbvonaab(int a, int b)&quot; dann ginge es ja...</p>
<p>Ebenso weiß ich noch nicht, wie &quot;WritableRangeT &amp; Input&quot; zu verstehen ist, was ist hier der Datentyp?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804735</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Sat, 07 Nov 2009 10:18:58 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 07 Nov 2009 11:08:17 GMT]]></title><description><![CDATA[<p>Ja, für einen C++-Neuling sind in der Funktionssignatur tatsächlich viele Features drin. C++ ist komplex (nicht kompliziert!), und man muß viel lernen. Aber das ist alles erlernbar und keine Magie! <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="😉"
    /> Wichtig ist sich die <em>gesamte</em> Funktions-Signatur anzuschauen:</p>
<pre><code class="language-cpp">template&lt;typename WritableRangeT&gt; // Funktion to_lower erwartet einen genauen Typnamen!!!
void to_lower(WritableRangeT &amp; Input,
                                      const std::locale &amp; Loc = std::locale());
</code></pre>
<p>Du mußt als erstes lernen was <em>Templates</em> sind, um <em>WritableRangeT</em> zu verstehen. Bei Templates handelt es sich &quot;nur&quot; um Codeschablonen, die erst zur Compilezeit typisiert werden. Grob gesagt kann WritableRangeT jeder Typ sein, mit dem das Template &quot;kompatibel&quot; ist. Range deutet darauf hin, das es ein Array, String, Vector etc. sein kann. Der vollständige Aufruf müsste so lauten:</p>
<pre><code class="language-cpp">string s(&quot;HaLLo!&quot;);
to_lower&lt;string&gt;(s);     // mit &lt;string&gt; typisiere ich WritableRangeT bzw. das Template
</code></pre>
<p>So weiß die Funktion, das s ein String-Objekt ist. Aber da bei solchen einfachen Funktionen der Compiler aus dem übergebenen Wert &quot;s&quot; den Typ string selber feststellen kann, muß man das nicht angeben.</p>
<pre><code class="language-cpp">string s(&quot;HaLLo!&quot;);
to_lower(s);     // &lt;string&gt; setzt der Compiler selbst ein... implizite Typisierung
</code></pre>
<p>Der Vorteil von Templates ist, das man Code für verschiedenen Typen benutzen kann. Und man spart sich Copy&amp;Paste in seinem Code. D.h. to_lower kann auch mit Arrays, Vector usw. arbeiten.</p>
<p>Das &amp; steht für By-Reference, also das die Funktion mit dem &quot;original&quot; Objekt arbeitet bzw. dieses manipulieren wird. Weitere Infos gibt es unter <a href="http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference" rel="nofollow">http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference</a>.</p>
<p>Hast du ein vernünftiges C++-Buch, in dem solche Dinge ausführlich und vor allem verständlich erklärt werden? Weil für C++ kommt man mit Try &amp; Error nicht schnell vor ran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804745</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sat, 07 Nov 2009 11:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sat, 07 Nov 2009 13:08:05 GMT]]></title><description><![CDATA[<p>Oder nimm QString<br />
<a href="http://doc.trolltech.com/4.5/qstring.html#toLower" rel="nofollow">http://doc.trolltech.com/4.5/qstring.html#toLower</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1804797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1804797</guid><dc:creator><![CDATA[blackfingernails]]></dc:creator><pubDate>Sat, 07 Nov 2009 13:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sun, 08 Nov 2009 07:35:04 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Du mußt als erstes lernen was <em>Templates</em> sind, um <em>WritableRangeT</em> zu verstehen. Bei Templates handelt es sich &quot;nur&quot; um Codeschablonen, die erst zur Compilezeit typisiert werden. Grob gesagt kann WritableRangeT jeder Typ sein, mit dem das Template &quot;kompatibel&quot; ist. Range deutet darauf hin, das es ein Array, String, Vector etc. sein kann. Der vollständige Aufruf müsste so lauten:</p>
<pre><code class="language-cpp">string s(&quot;HaLLo!&quot;);
to_lower&lt;string&gt;(s);     // mit &lt;string&gt; typisiere ich WritableRangeT bzw. das Template
</code></pre>
<p>So weiß die Funktion, das s ein String-Objekt ist. Aber da bei solchen einfachen Funktionen der Compiler aus dem übergebenen Wert &quot;s&quot; den Typ string selber feststellen kann, muß man das nicht angeben.</p>
<pre><code class="language-cpp">string s(&quot;HaLLo!&quot;);
to_lower(s);     // &lt;string&gt; setzt der Compiler selbst ein... implizite Typisierung
</code></pre>
<p>Der Vorteil von Templates ist, das man Code für verschiedenen Typen benutzen kann. Und man spart sich Copy&amp;Paste in seinem Code. D.h. to_lower kann auch mit Arrays, Vector usw. arbeiten.</p>
</blockquote>
<p>Also, geht es darum, dass ich a) einer Funktion dann unterschiedliche, sinnvolle Typen übergeben kann und b) je nach Eingabetyp in der Funktion handeln kann? Bspw. könnte eine Funktion sowohl ein Char-Array als auch einen String bekommen?</p>
<p>Und irgendwas habe ich doch sicher übersehen: an so einer Funktionssignatur &quot;..(WritableRangeT ...) sehe ich doch gar nicht, welche(r) Typ(en) denn nun erlaubt sind?</p>
<blockquote>
<p>Das &amp; steht für By-Reference, also das die Funktion mit dem &quot;original&quot; Objekt arbeitet bzw. dieses manipulieren wird. Weitere Infos gibt es unter <a href="http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference" rel="nofollow">http://www.kharchi.eu/wiki/doku.php?id=cpp:std:reference</a>.</p>
<p>Hast du ein vernünftiges C++-Buch, in dem solche Dinge ausführlich und vor allem verständlich erklärt werden? Weil für C++ kommt man mit Try &amp; Error nicht schnell vor ran.</p>
</blockquote>
<p>Ja, habe ein Buch von Dirk Louis. Muss ich nochmal lesen, ich glaube da stand etwas in der Zeiger-Ecke, eine Giftküche, an der ich schnell vorbeigelesen hatte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1805013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1805013</guid><dc:creator><![CDATA[Squeller]]></dc:creator><pubDate>Sun, 08 Nov 2009 07:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sun, 08 Nov 2009 13:08:21 GMT]]></title><description><![CDATA[<p>ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1805144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1805144</guid><dc:creator><![CDATA[jaja]]></dc:creator><pubDate>Sun, 08 Nov 2009 13:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sun, 08 Nov 2009 14:06:43 GMT]]></title><description><![CDATA[<p>Wenn er auf Boost verzichten will, kann er doch die, ein paar Seiten weiter vorne gepostete, einfache und funktionierende Lösung verwenden:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;string&gt;

std::string test = &quot;THIS IS MY STRING&quot;;
std::transform(test.begin(), test.end(), test.begin(), std::tolower);
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1805172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1805172</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Sun, 08 Nov 2009 14:06:43 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sun, 08 Nov 2009 14:16:03 GMT]]></title><description><![CDATA[<p>jaja schrieb:</p>
<blockquote>
<p>ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...</p>
</blockquote>
<p>C++ ... kompliziertes Denken ... irgendwas war da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1805175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1805175</guid><dc:creator><![CDATA[dunkleErinnerung]]></dc:creator><pubDate>Sun, 08 Nov 2009 14:16:03 GMT</pubDate></item><item><title><![CDATA[Reply to Newbie: Vernünftiger Umgang mit Strings? on Sun, 08 Nov 2009 16:22:36 GMT]]></title><description><![CDATA[<p>jaja schrieb:</p>
<blockquote>
<p>ganz ehrlich, merkt ihr es noch? er will einen string per tolower umwandeln und bekommt templates, boost oder qt vorgesetzt. Irgendwas stimmt da doch ganz gewaltig nicht...</p>
</blockquote>
<p>Vielleicht hast du nichts bemerkt, aber es geht hier in diesem Topic schon laaange nicht mehr um &quot;Wie mache ich Zeichen klein?&quot;. Es geht hier mittlerweile um C++-Syntax und -Features, am Beispiel von to_lower. Es könnte aber auch jede andere Funktion aus C++ sein! Er hätte bei jeder anderen C++-Funktion die gleichen Fragen gestellt. Er lernt noch C++, das hat nichts mit Boost oder so zu tun. Wer kein C++ kann, wird nun mal solche Fragen stellen. Das er noch kein C++ kann, kann ja wohl C++ oder Boost nichts für.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1805233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1805233</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 08 Nov 2009 16:22:36 GMT</pubDate></item></channel></rss>