<?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[Wortzusammensetzung über Pointer und getline() statt mit gets()]]></title><description><![CDATA[<p>Hallo und guten Morgen liebe Gemeinde.</p>
<p>Vor einigen Wochen habe ich folgenden Code gepostet:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{
	char text1[80];
	char text2[40];
	char text3[40];

	cout &lt;&lt; &quot;Erstes Wort eingeben: &quot;;
	gets(text2);

	cout &lt;&lt; &quot;Zweites Wort eingeben: &quot;;
	gets(text3);

	strcpy(text1, text2);
	strcat(text1, text3);

	cout &lt;&lt; &quot;Zusammengefuegt: &quot; &lt;&lt; text1 &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Da mir geschrieben wurde, dass dieser Code aufgrund der Verwendung von der Funktion gets() nicht so gut sein solle, habe ich heute versucht, über Pointer und getline() den gleichen Code zu schreiben.</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;string&gt;
using namespace std;

int main()
{
	char Text_1[160];
	char *pText_1 = {&amp;Text_1[160]};
	char Text_2[80];
	char *pText_2 = {&amp;Text_2[80]};
	char Text_3[80];
	char *pText_3 = {&amp;Text_3[80]};

	cout &lt;&lt; &quot;Erstes Wort eingeben:\n&quot;;
	getline(cin, &amp;Text_2);

	cout &lt;&lt; &quot;Zweites Wort eingeben:\n&quot;;
	getline(cin, &amp;Text_3);

	strcpy(&amp;Text_1, &amp;Text_2);
	strcat(&amp;Text_1, &amp;Text_3);

	cout &lt;&lt; &quot;Zusammengefuegtes Wort:&quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom ersten Wort:            &quot; &lt;&lt; &amp;Text_2 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zweiten Wort:           &quot; &lt;&lt; &amp;Text_3 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zusammengefuegten Wort: &quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;

	return 0;
}
</code></pre>
<p>Bei diesem Code bekomme ich jedoch die wüßten Fehlermeldungen.</p>
<p>Auch habe ich in meinen Büchern nichts verwertbares dazu gefunden.</p>
<p>Was habe ich falsch gemacht bzw. wo ist mein Denkfehler?</p>
<p>Danke für die Antworten im Voraus.</p>
<p>Gruß</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311806/wortzusammensetzung-über-pointer-und-getline-statt-mit-gets</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 09:39:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311806.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Dec 2012 09:15:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:15:29 GMT]]></title><description><![CDATA[<p>Hallo und guten Morgen liebe Gemeinde.</p>
<p>Vor einigen Wochen habe ich folgenden Code gepostet:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main()
{
	char text1[80];
	char text2[40];
	char text3[40];

	cout &lt;&lt; &quot;Erstes Wort eingeben: &quot;;
	gets(text2);

	cout &lt;&lt; &quot;Zweites Wort eingeben: &quot;;
	gets(text3);

	strcpy(text1, text2);
	strcat(text1, text3);

	cout &lt;&lt; &quot;Zusammengefuegt: &quot; &lt;&lt; text1 &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Da mir geschrieben wurde, dass dieser Code aufgrund der Verwendung von der Funktion gets() nicht so gut sein solle, habe ich heute versucht, über Pointer und getline() den gleichen Code zu schreiben.</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;string&gt;
using namespace std;

int main()
{
	char Text_1[160];
	char *pText_1 = {&amp;Text_1[160]};
	char Text_2[80];
	char *pText_2 = {&amp;Text_2[80]};
	char Text_3[80];
	char *pText_3 = {&amp;Text_3[80]};

	cout &lt;&lt; &quot;Erstes Wort eingeben:\n&quot;;
	getline(cin, &amp;Text_2);

	cout &lt;&lt; &quot;Zweites Wort eingeben:\n&quot;;
	getline(cin, &amp;Text_3);

	strcpy(&amp;Text_1, &amp;Text_2);
	strcat(&amp;Text_1, &amp;Text_3);

	cout &lt;&lt; &quot;Zusammengefuegtes Wort:&quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom ersten Wort:            &quot; &lt;&lt; &amp;Text_2 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zweiten Wort:           &quot; &lt;&lt; &amp;Text_3 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zusammengefuegten Wort: &quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;

	return 0;
}
</code></pre>
<p>Bei diesem Code bekomme ich jedoch die wüßten Fehlermeldungen.</p>
<p>Auch habe ich in meinen Büchern nichts verwertbares dazu gefunden.</p>
<p>Was habe ich falsch gemacht bzw. wo ist mein Denkfehler?</p>
<p>Danke für die Antworten im Voraus.</p>
<p>Gruß</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280267</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:32:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Was habe ich falsch gemacht bzw. wo ist mein Denkfehler?</p>
</blockquote>
<p>Du benutzt C-Strings.<br />
Das geht nie gut. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;

int main()
{
    std::string str, str2, strinst;

    std::cout &lt;&lt; &quot;Geben Sie bitte ein Wort ein: &quot;;
    std::cin &gt;&gt; str;
    std::cout &lt;&lt; &quot;Geben Sie bitte ein zweites Wort ein: &quot;;
    std::cin &gt;&gt; str2;

    strinst = str + str2;
    std::cout &lt;&lt; &quot;Zusammengesetztes Wort: &quot; &lt;&lt; strinst &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom ersten Wort: &quot;            &lt;&lt; reinterpret_cast&lt;void const*&gt;(str    .c_str()) &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom zweiten Wort: &quot;           &lt;&lt; reinterpret_cast&lt;void const*&gt;(str2   .c_str()) &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom zusammengesetzten Wort: &quot; &lt;&lt; reinterpret_cast&lt;void const*&gt;(strinst.c_str()) &lt;&lt; '\n';
}
</code></pre>
<p>:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280272</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:34:41 GMT]]></title><description><![CDATA[<p>was soll das denn alles werden ?<br />
benutze einfach std::string und du hast keine probleme mehr.<br />
aber wenn du es mit c-strings machen willst, brauchst du dafür keine pointer:</p>
<pre><code>#include &lt;iostream&gt;

int main()
{
    char c[50];
    std::cin.getline(c, 50);
    std::cout &lt;&lt; c &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>ich versteh aber immer noch nicht, warum du nicht std::string verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280273</guid><dc:creator><![CDATA[vario-500]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:39:51 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Du benutzt C-Strings.<br />
Das geht nie gut.</p>
</blockquote>
<p>Also kann ich es über Pointer auf chars vergessen oder gibt es einen Weg??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280275</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:39:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:44:45 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Du benutzt C-Strings.<br />
Das geht nie gut.</p>
</blockquote>
<p>Also kann ich es über Pointer auf chars vergessen oder gibt es einen Weg??</p>
</blockquote>
<p>Natürlich gibt es Wege.</p>
<p>Aber wozu das Leben schwer machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280276</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 10:02:49 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<p>Bei diesem Code bekomme ich jedoch die wüßten Fehlermeldungen.</p>
</blockquote>
<p>Welche? Und was verstehst du an den Fehlermeldungen nicht?</p>
<p>silent_max schrieb:</p>
<blockquote>
<p>Auch habe ich in meinen Büchern nichts verwertbares dazu gefunden.</p>
</blockquote>
<p>Wonach hast du denn genau gesucht?</p>
<p>silent_max schrieb:</p>
<blockquote>
<p>Was habe ich falsch gemacht bzw. wo ist mein Denkfehler?</p>
</blockquote>
<p>Eine ganze Menge. Dein aktueller C++-Lern-Ansatz scheint sehr ineffizient zu sein. Ich kann nicht glauben, dass du die Bücher, die du angeblich besitzt, richtig verwendest. Dein zweites Programm ergibt von vorne bis hinten keinen Sinn. Erzähl mal, was du dir dabei gedacht hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280278</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 10:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 09:51:50 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Aber wozu das Leben schwer machen?</p>
</blockquote>
<p>Was heißt schwer machen?</p>
<p>Ich wollte einfach wissen, ob das klappt oder nicht. Und da mein Denkansatz wohl falsch ist, wollte ich euch Profis nach Tipps und Tricks fragen, wie ich über Pointer auf chars und der Funktion getline() ein Wort zusammen fügen kann, da ja die Funktion gets() verpönnt ist.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280279</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sat, 15 Dec 2012 09:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 10:39:41 GMT]]></title><description><![CDATA[<p>Was soll an getline mit char-Arrays besser sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280285</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 15 Dec 2012 10:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 10:49:19 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<p>... wollte ich euch Profis nach Tipps und Tricks fragen ...</p>
</blockquote>
<p>Die Tips und Tricks lauten ganz einfach:<br />
Benutze - wo immer es geht - std::string anstelle von C-Strings.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280292</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Sat, 15 Dec 2012 10:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 10:51:03 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Was soll an getline mit char-Arrays besser sein?</p>
</blockquote>
<p>Ne ganze Menge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280293</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 10:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 11:03:17 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Zusammengesetztes Wort: &quot; &lt;&lt; strinst &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom ersten Wort: &quot;            &lt;&lt; reinterpret_cast&lt;void const*&gt;(str    .c_str()) &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom zweiten Wort: &quot;           &lt;&lt; reinterpret_cast&lt;void const*&gt;(str2   .c_str()) &lt;&lt; '\n'
              &lt;&lt; &quot;Speicheradresse vom zusammengesetzten Wort: &quot; &lt;&lt; reinterpret_cast&lt;void const*&gt;(strinst.c_str()) &lt;&lt; '\n';
}
</code></pre>
</blockquote>
<p><code>static_cast</code> hätte es auch getan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280296</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 15 Dec 2012 11:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 11:22:52 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Die Tips und Tricks lauten ganz einfach:<br />
Benutze - wo immer es geht - std::string anstelle von C-Strings.</p>
</blockquote>
<p>Das würde ich noch einschränken. std::string braucht man nicht für Konstanten. const-char-Zeiger, die z.B. auf die Zeichenkettenliteral-Arrays zeigen, sind ja in Ordnung. Den Speicher, auf den sie zeigen, muss man nicht selbst verwalten und mit dem Read-Only-Zugriff kann man auch nicht viel Schaden anrichten.</p>
<p>Ich denke da an solche Situationen:</p>
<pre><code class="language-cpp">//im header

string errormsg(int errorcode);
</code></pre>
<pre><code class="language-cpp">//im cpp file

const string emlist[] = {
  &quot;foo&quot;, &quot;bar&quot;
};

string errormsg(int errorcode) {
  if (errorcode&lt;0 || errorcode&gt;=2) return &quot;wtf&quot;;
  return emlist[errorcode];
}
</code></pre>
<p>wo std::string eine ziemlich blöde Idee ist. Besser:</p>
<pre><code class="language-cpp">//im header

const char* errormsg(int errorcode);
</code></pre>
<pre><code class="language-cpp">//im cpp file

const char*const emlist[] = {
  &quot;foo&quot;, &quot;bar&quot;
};

const char* errormsg(int errorcode) {
  if (errorcode&lt;0 || errorcode&gt;=2) return &quot;wtf&quot;;
  return emlist[errorcode];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2280299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280299</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 11:22:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 11:28:13 GMT]]></title><description><![CDATA[<p>Warum nicht so?</p>
<pre><code class="language-cpp">namespace
{
  const std::array&lt;std::string, 2&gt; emlist = {{
    &quot;foo&quot;, &quot;bar&quot;
  }};
}

const std::string &amp;errormsg(unsigned errorcode) {
  assert(errorcode &lt; emlist.size());
  return emlist[errorcode];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2280300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280300</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 15 Dec 2012 11:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 11:34:23 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Warum nicht so?</p>
<pre><code class="language-cpp">namespace
{
  const std::array&lt;std::string, 2&gt; emlist = {{
    &quot;foo&quot;, &quot;bar&quot;
  }};
}
 
const std::string &amp;errormsg(unsigned errorcode) {
  assert(errorcode &lt; emlist.size());
  return emlist[errorcode];
}
</code></pre>
</blockquote>
<p>kk schrieb:</p>
<blockquote>
<p>std::string braucht man nicht für Konstanten. const-char-Zeiger, die z.B. auf die Zeichenkettenliteral-Arrays zeigen, sind ja in Ordnung. Den Speicher, auf den sie zeigen, muss man nicht selbst verwalten und mit dem Read-Only-Zugriff kann man auch nicht viel Schaden anrichten.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2280301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280301</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 11:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 11:49:12 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>kk schrieb:</p>
<blockquote>
<p>std::string braucht man nicht für Konstanten. const-char-Zeiger, die z.B. auf die Zeichenkettenliteral-Arrays zeigen, sind ja in Ordnung. Den Speicher, auf den sie zeigen, muss man nicht selbst verwalten und mit dem Read-Only-Zugriff kann man auch nicht viel Schaden anrichten.</p>
</blockquote>
</blockquote>
<p>Und was soll an dem Zeigergefrickel jetzt <em>besser</em> sein als <code>string</code> ?<br />
Die paar gesparten Bytes zählen nicht. Die gesparte Indirektion auch nicht, das spielt bei Fehlerbehandlung keine Rolle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280303</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 15 Dec 2012 11:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 13:15:19 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Warum nicht so?</p>
<pre><code class="language-cpp">namespace
{
  const std::array&lt;std::string, 2&gt; emlist = {{
    &quot;foo&quot;, &quot;bar&quot;
  }};
}
 
const std::string &amp;errormsg(unsigned errorcode) {
  assert(errorcode &lt; emlist.size());
  return emlist[errorcode];
}
</code></pre>
</blockquote>
<p>Mach, was du willst. Mir passt da die dynamische Initialisierung nicht, in der Zeichenketten aus dem statischen Speicher (die Literal-Arrays) kurz vor der Ausführung von main sinnloserweise in den Freispeicher kopiert werden. Damit gewinnst du noch nicht mal etwas...</p>
<p><code>std::string</code> bzw <code>const std::string&amp;</code> <em>hier</em> durch <code>const char*</code> zu ersetzen ist keine Pointer-Frickelei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280324</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 13:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 13:18:37 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>kk schrieb:</p>
<blockquote>
<p>std::string braucht man nicht für Konstanten. const-char-Zeiger, die z.B. auf die Zeichenkettenliteral-Arrays zeigen, sind ja in Ordnung. Den Speicher, auf den sie zeigen, muss man nicht selbst verwalten und mit dem Read-Only-Zugriff kann man auch nicht viel Schaden anrichten.</p>
</blockquote>
</blockquote>
<p>Und was soll an dem Zeigergefrickel jetzt <em>besser</em> sein als <code>string</code> ?</p>
</blockquote>
<p>Und was soll in diesem Fall an <code>string</code> besser sein?</p>
<pre><code>namespace
{
  const std::array&lt;char const*, 2&gt; emlist = {{
    &quot;foo&quot;, &quot;bar&quot;
  }};
}

char const* &amp;errormsg(std::array&lt;char const*, 2&gt;::size_type errorcode) {
  assert(errorcode &lt; emlist.size());
  return emlist[errorcode];
}
</code></pre>
<p><strong>Edit:</strong></p>
<blockquote>
<p>std::string bzw const std::string&amp; hier durch const char* zu ersetzen ist keine Pointer-Frickelei.</p>
</blockquote>
<p><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="👍"
    /><br />
Wie kamst du darauf, Tyrox?</p>
<p>Immer diese Vorurteile gegenüber Zeigern...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280326</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 13:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 17:43:45 GMT]]></title><description><![CDATA[<p>Auch dieser Code wird von meinem Compiler nicht angenommen:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;

int main()
{
	char Text_1[160];
	char *pText_1 = {&amp;Text_1[160]};
	char Text_2[80];
	char *pText_2 = {&amp;Text_2[80]};
	char Text_3[80];
	char *pText_3 = {&amp;Text_3[80]};

	cout &lt;&lt; &quot;Erstes Wort eingeben:\n&quot;;
	gets(&amp;Text_2);

	cout &lt;&lt; &quot;Zweites Wort eingeben:\n&quot;;
	gets(&amp;Text_3);

	strcpy(&amp;Text_1, &amp;Text_2);
	strcat(&amp;Text_1, &amp;Text_3);

	cout &lt;&lt; &quot;Zusammengefuegtes Wort:&quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom ersten Wort:            &quot; &lt;&lt; &amp;Text_2 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zweiten Wort:           &quot; &lt;&lt; &amp;Text_3 &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Speicheradresse vom zusammengefuegten Wort: &quot; &lt;&lt; &amp;Text_1 &lt;&lt; &quot;\n&quot;;

	return 0;
}
</code></pre>
<p>Dann kann ich die Idee ja völlig vergessen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280438</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sat, 15 Dec 2012 17:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 17:56:22 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<p>Auch dieser Code wird von meinem Compiler nicht angenommen</p>
</blockquote>
<p>Was sagt er denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280439</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 17:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 18:00:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
 error C2664: 'strcpy': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
error C2664: 'strcat': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2280441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280441</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sat, 15 Dec 2012 18:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 18:14:38 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<pre><code class="language-cpp">error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
 error C2664: 'strcpy': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
error C2664: 'strcat': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
</code></pre>
</blockquote>
<p>Wieso nimmst du denn auch die Adressen der Arrays?<br />
Übergib' einfach direkt die Arrays, das array-to-pointer decay macht den Rest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280445</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 15 Dec 2012 18:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 18:28:09 GMT]]></title><description><![CDATA[<p>silent_max schrieb:</p>
<blockquote>
<pre><code class="language-cpp">error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
error C2664: 'gets': Konvertierung des Parameters 1 von 'char (*)[80]' in 'char *' nicht möglich
 error C2664: 'strcpy': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
error C2664: 'strcat': Konvertierung des Parameters 1 von 'char (*)[160]' in 'char *' nicht möglich
</code></pre>
</blockquote>
<p>Verstehst du diese Fehlermeldungen? Weißt du, was char(*)[80] ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280453</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 18:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 23:32:47 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Und was soll in diesem Fall an <code>string</code> besser sein?</p>
<pre><code>namespace
{
  const std::array&lt;char const*, 2&gt; emlist = {{
    &quot;foo&quot;, &quot;bar&quot;
  }};
}
 
char const* &amp;errormsg(std::array&lt;char const*, 2&gt;::size_type errorcode) {
  assert(errorcode &lt; emlist.size());
  return emlist[errorcode];
}
</code></pre>
<p>[...]</p>
<p>Immer diese Vorurteile gegenüber Zeigern...</p>
</blockquote>
<p>In Zeile 8 sehe ich ein falsches <code>&amp;</code> . Beim Umgang mit Zeigern hast du also schon in so einem simplen Beispiel einen Flüchtigkeitsfehler gemacht. Mit <code>string</code> wäre das nicht passiert.</p>
<p>Ich sehe ja ein, dass die Speicheranforderung durch <code>string</code> verschwenderisch ist. Aber <code>const char *</code> ist <em>eindeutig</em> die falsche Alternative. Die Idee von C++ ist nicht, dass man bei jedem kleinen Hindernis in prähistorisches Verhalten zurückfällt.</p>
<p>Die Vorteile von <code>string</code> ohne die Nachteile:</p>
<pre><code class="language-cpp">#include &lt;utility&gt;
#include &lt;iostream&gt;
#include &lt;array&gt;
#include &lt;cassert&gt;
#include &lt;cstring&gt;

template &lt;class C&gt;
class basic_string_ref
{
public:

	typedef C value_type;
	typedef C &amp;reference;
	typedef C *iterator;
	typedef iterator const_iterator;
	typedef std::size_t size_type;

	basic_string_ref();
	basic_string_ref(iterator begin, iterator end);

	template &lt;std::size_t N&gt;
	basic_string_ref(value_type (&amp;data)[N]);

	basic_string_ref(iterator c_string)
		: m_begin(c_string)
		, m_end(c_string + std::strlen(c_string))
	{
	}

	size_type size() const
	{
		return std::distance(m_begin, m_end);
	}

	iterator data() const
	{
		return m_begin;
	}

	bool empty() const;
	iterator begin() const
	{
		return m_begin;
	}

	iterator end() const
	{
		return m_end;
	}
	//...

private:

	iterator m_begin;
	iterator m_end;
};

template &lt;class C&gt;
std::basic_ostream&lt;typename std::remove_const&lt;C&gt;::type&gt; &amp;operator &lt;&lt; (
std::basic_ostream&lt;typename std::remove_const&lt;C&gt;::type&gt; &amp;os, basic_string_ref&lt;C&gt; const &amp;str)
{
	std::copy(str.begin(), str.end(),
		std::ostreambuf_iterator&lt;typename std::remove_const&lt;C&gt;::type&gt;(os));
	return os;
}

typedef basic_string_ref&lt;char&gt; string_ref;
typedef basic_string_ref&lt;const char&gt; cstring_ref;

namespace
{
	const std::array&lt;cstring_ref, 2&gt; emlist =
	{{
		&quot;foo&quot;,
		&quot;bar&quot;
	}};
}

cstring_ref const &amp;errormsg(unsigned errorcode)
{
	assert(errorcode &lt; emlist.size());
	return emlist[errorcode];
}

int main()
{
	for (auto i = emlist.begin(); i != emlist.end(); ++i)
	{
		std::cout &lt;&lt; *i &lt;&lt; '\n';
	}
}
</code></pre>
<p>EDIT: <code>const</code> -Verhalten korrigiert (danke an krümelkacker).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280454</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 15 Dec 2012 23:32:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sat, 15 Dec 2012 22:23:34 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ich sehe ja ein, dass die Speicheranforderung durch <code>string</code> verschwenderisch ist. Aber <code>const char *</code> ist <em>eindeutig</em> die falsche Alternative.</p>
</blockquote>
<p>Das ist deine Meinung, die ich nicht mit dir teile.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Die Idee von C++ ist nicht, dass man bei jedem kleinen Hindernis in prähistorisches Verhalten zurückfällt.</p>
</blockquote>
<p>Hast du ein anderes Argument als &quot;ich finde, das gehört nur in die Prähistorie&quot; parat? Denn es ist keins.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Die Vorteile von <code>string</code> ohne die Nachteile:<br />
[...]</p>
</blockquote>
<p>Das finde ich nicht überzeugend genug, als dass ich behaupten wollen würde, alles andere sei &quot;eindeutig falsch&quot;.</p>
<p>Ich denke auch, dass du dein basic_string_ref nicht ganz zu Ende gedacht hast. Die const/nonconst Überladungen für begin/end finde ich komisch. Das passt einfach nicht zur restlichen Referenz/Zeiger-Semantik, die dieser Typ hat. Ist Dir schon mal aufgefallen, dass ein shared_ptr&lt;T&gt; folgenden Dereferenzierungsoperator bietet?</p>
<pre><code>T&amp; operator*() const
  ^^             ^^^^^
</code></pre>
<p>Das const überträgt sich da nicht auf den Rückgabetyp bei so einem Zeiger-artigem Objekt. Und das ist auch sinnvoll so; denn ein &quot;deep const&quot; bringt nichts, wenn man das Objekt kopieren kann und über die non-const Kopie auf dieselben Daten zugreifen kann. Ich hätte bei dir folgendes erwartet:</p>
<pre><code>T* begin() const {...} 
 T* end() const {...}
</code></pre>
<p>und dann am besten noch einen Konvertierungskonstruktor für string_ref -&gt; cstring_ref eingebaut.</p>
<p>Aber wie unterscheidet sich jetzt cstring_ref von const char*? So, wie du es aktuell gebaut hast, beschränken sich die Unterschiede auf ein &quot;STL Interface&quot;. Ein STL Interface ist nett, brauche ich aber bei Stringkonstanten so gut wie nie.</p>
<p>Das praktische an so einem benutzerdefinierten Typ ist nicht die Rückgabe von strings, sondern das Empfangen von Strings als Funktionsparameter. Man kann den Typ so bauen, dass dem Benutzer das &quot;.c_str()&quot; erspart bleibt, wenn er einen std::string zur Hand hat. Wenn ich mich richtig erinnere, ist das auch die Motivation des <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3334.html" rel="nofollow">string_ref</a>-Proposals.</p>
<p>Ich gehöre zu den ersten, die sich über Zeiger-Frickelei aufregen. Habe auch schon in ähnlicher Form ein array_ref-Klassentemplate gebastelt, was sich mit allerlei Dingen hat initialisieren lassen ( <code>std::vector</code> , <code>std::array</code> , rohes Array) sogar mit so lustigen Konvertierungen wie std::vector&lt;Dings*&gt; --&gt; array_ref&lt;<strong>const</strong> Dings* const&gt;, die C++ mit rohen Zeigern erlaubt, ohne dass das ein Problem wär.</p>
<p>Aber const char* oder const char[] für Zeichenkettenkonstanten kann ich bei bestem Gewissen nicht verteufeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280508</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 15 Dec 2012 22:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sun, 16 Dec 2012 11:58:16 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Wieso nimmst du denn auch die Adressen der Arrays?<br />
Übergib' einfach direkt die Arrays, das array-to-pointer decay macht den Rest.</p>
</blockquote>
<p>Wie meinst Du das??</p>
<p>Kannst Du nicht einen Beispielcode schreiben? Weil ich verstehe bei &quot;array-to-pointer decay&quot; nicht, was Du meinst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280571</guid><dc:creator><![CDATA[silent_max]]></dc:creator><pubDate>Sun, 16 Dec 2012 11:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wortzusammensetzung über Pointer und getline() statt mit gets() on Sun, 16 Dec 2012 13:12:04 GMT]]></title><description><![CDATA[<p>Wenn du den Adressoperator auf einen Ausdruck des Typs T anwendest, bekommst du einen Zeigerwert des Typs T*. Logisch, oder?</p>
<p>Text_1 hat bei dir den Typ char[160]. Also ist &amp;Text_1 ein Zeigerwert des Typs char(*)[160]. Logisch, oder?</p>
<p>Die gets-Funktion will aber einen Zeiger vom Typ char* haben.</p>
<p>Siehe<br />
<a href="http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr" rel="nofollow">http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr</a><br />
(u.a. Frage 6.12)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2280581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2280581</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 16 Dec 2012 13:12:04 GMT</pubDate></item></channel></rss>