<?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[Überlauf beim Char-Array]]></title><description><![CDATA[<p>Hallo,<br />
ich schreibe zzt. eine Studienleistung in Informatik, welche römische Zahlen in arabische umwandeln soll. Dabei soll über eine cin Elementfunktion in ein Char-Array eingelesen werden. Hier ergibt sich die Gefahr des Überlaufs, sprich der Eingabestrom ist länger als das Array. Mein Lösungsansatz lautet:</p>
<p>char wandelZahl[21]</p>
<p>// Eingabe einlesen<br />
cin.getline(wandelZahl,21);</p>
<p>// Tastaturpuffer leeren, falls Eingabe &gt; 20 Zeichen:</p>
<p>if((cin.rdbuf()-&gt;in_avail())&gt;1){</p>
<p>cin.clear(); // Falls Fehlerbit gesetzt wird!? sinnvoll?<br />
cin.ignore(cin.rdbuf()-&gt;in_avail());</p>
<p>cout &lt;&lt; &quot;Eingabe ist länger als 20 Zeichen!&quot;<br />
return 0;</p>
<p>}</p>
<p>Leider funktioniert das nicht so richtig. Bei einer Eingabe über 20 Zeichen wird eine andere Fehlermeldung aus einem ganz anderen Programmteil ausgegeben und das Programm endet nicht von selbst. Hab ich einen logischen oder syntaktischen Fehler drin? Gibts es vllt. Alternativen, die wesentlich eleganter sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292612/überlauf-beim-char-array</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 20:57:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292612.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Sep 2011 22:09:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überlauf beim Char-Array on Tue, 13 Sep 2011 22:09:25 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich schreibe zzt. eine Studienleistung in Informatik, welche römische Zahlen in arabische umwandeln soll. Dabei soll über eine cin Elementfunktion in ein Char-Array eingelesen werden. Hier ergibt sich die Gefahr des Überlaufs, sprich der Eingabestrom ist länger als das Array. Mein Lösungsansatz lautet:</p>
<p>char wandelZahl[21]</p>
<p>// Eingabe einlesen<br />
cin.getline(wandelZahl,21);</p>
<p>// Tastaturpuffer leeren, falls Eingabe &gt; 20 Zeichen:</p>
<p>if((cin.rdbuf()-&gt;in_avail())&gt;1){</p>
<p>cin.clear(); // Falls Fehlerbit gesetzt wird!? sinnvoll?<br />
cin.ignore(cin.rdbuf()-&gt;in_avail());</p>
<p>cout &lt;&lt; &quot;Eingabe ist länger als 20 Zeichen!&quot;<br />
return 0;</p>
<p>}</p>
<p>Leider funktioniert das nicht so richtig. Bei einer Eingabe über 20 Zeichen wird eine andere Fehlermeldung aus einem ganz anderen Programmteil ausgegeben und das Programm endet nicht von selbst. Hab ich einen logischen oder syntaktischen Fehler drin? Gibts es vllt. Alternativen, die wesentlich eleganter sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2118969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2118969</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Tue, 13 Sep 2011 22:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Tue, 13 Sep 2011 22:24:08 GMT]]></title><description><![CDATA[<p>C++ stellt dir die string-Klasse zur Verfügung, benutze doch diese <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/2118973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2118973</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 13 Sep 2011 22:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Tue, 13 Sep 2011 22:31:19 GMT]]></title><description><![CDATA[<p>Die darf ich leider nicht benutzen...hat unser Prof. verboten. Wahrscheinlich weil wir den Umgang mit Arrays üben sollen.</p>
<p>Edit: ich darf jedoch den C-String und die zugehörigen Funktionen aus &lt;string.h&gt; benutzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2118977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2118977</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Tue, 13 Sep 2011 22:31:19 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 03:40:43 GMT]]></title><description><![CDATA[<p>TiSie schrieb:</p>
<blockquote>
<p>Leider funktioniert das nicht so richtig. Bei einer Eingabe über 20 Zeichen wird eine andere Fehlermeldung aus einem ganz anderen Programmteil ausgegeben und das Programm endet nicht von selbst. Hab ich einen logischen oder syntaktischen Fehler drin? Gibts es vllt. Alternativen, die wesentlich eleganter sind?</p>
</blockquote>
<p>Wenn man in deinem geposteten Codeschnipsel die fehlenden Semikolons hinzufügt und alles in eine main Funktion einfügt, funktioniert das Programm und tut auch das was du erwartest. Der Fehler liegt daher vermutlich nicht innerhalb der geposteten Zeilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119005</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Wed, 14 Sep 2011 03:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 07:34:24 GMT]]></title><description><![CDATA[<p>Hier nochmal den Code-Schnipsel als eigenes Programm (und fehlende Semikolons ergänzt). Funktioniert leider immer noch nicht. Liegt es vllt an der Entwicklungsumgebung? Arbeite mit Dev-C++</p>
<pre><code class="language-cli">#include &lt;iostream&gt;
using namespace std;

main(){

  char wandelZahl[21];

// Eingabe einlesen
  cin.getline(wandelZahl,21);

// Tastaturpuffer leeren, falls Eingabe &gt; 20 Zeichen:

  if((cin.rdbuf()-&gt;in_avail())&gt;1){

      cin.clear(); // Falls Fehlerbit gesetzt wird!? sinnvoll?
      cin.ignore(cin.rdbuf()-&gt;in_avail());

      cout &lt;&lt; &quot;Eingabe ist länger als 20 Zeichen!&quot;;

      system(&quot;pause&quot;);
      return 0;

    } 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2119063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119063</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Wed, 14 Sep 2011 07:34:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 08:01:05 GMT]]></title><description><![CDATA[<p>Wie wär's, wenn du mal Fehlermeldung und -position im Code postest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119072</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 14 Sep 2011 08:01:05 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 08:41:58 GMT]]></title><description><![CDATA[<p>Das merkwürdige ist, dass keine Fehlermeldung erscheint. Die Compilation und Ausführung des Programms erfolgt ohne Probleme.</p>
<p>Bei der anschließenden Eingabe von weniger als 21 Zeichen wird nichts ausgegeben, was ja auch logisch ist, weil die Bedingung der if-Selektion nicht erfüllt ist.</p>
<p>Bei der Eingabe von gleich oder mehr als 21 Zeichen müsste dann jedoch die Eintrittsbedingung erfüllt sein und &quot;Eingabe ist länger als 20 Zeichen!&quot; ausgegeben werden. Dies wird aber aus mir unerklärlichen Gründen nicht gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119109</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Wed, 14 Sep 2011 08:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 08:46:24 GMT]]></title><description><![CDATA[<p>in_avail() ist in der Regel immer 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119111</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 Sep 2011 08:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 09:04:51 GMT]]></title><description><![CDATA[<p>ich dachte cin.rdbuf()-&gt;in_avail() gibt mir die Anzahl Zeichen wieder, die sich noch im Lesepuffer befinden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119125</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Wed, 14 Sep 2011 09:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 09:20:48 GMT]]></title><description><![CDATA[<p>So sollte es funktionieren...</p>
<pre><code class="language-cpp">if (!(cin.getline(wandelZahl,21))) {
   cout &lt;&lt; &quot;Eingabe ist länger als 20 Zeichen!&quot;;
}
</code></pre>
<p>Gruss,<br />
arb3r</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119128</guid><dc:creator><![CDATA[arb3r]]></dc:creator><pubDate>Wed, 14 Sep 2011 09:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 09:18:09 GMT]]></title><description><![CDATA[<p>TiSie schrieb:</p>
<blockquote>
<p>ich dachte cin.rdbuf()-&gt;in_avail() gibt mir die Anzahl Zeichen wieder, die sich noch im Lesepuffer befinden?</p>
</blockquote>
<p>Ja, im Lesepuffer des C++-Streams. Die Zeichen könnten sich aber noch im Puffer des Betriebssystems befinden und erst beim nächsten Leseaufruf in den Puffer des Streams übertragen werden.</p>
<p>Ergo ist die Aussagekraft von in_avail, wie SeppJ schon sagte, in diesem Fall ziemlich wertlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119135</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Sep 2011 09:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 09:36:54 GMT]]></title><description><![CDATA[<p>ah okay, die direkte Boolesche Abfrage ist natürlich elegant. Danke dafür. Damit läuft das Programm. Hab aber noch zwei Fragen:</p>
<p>1. Wann ist !(cin.getline(wandelZahl,21)=true ?? Wirklich nur bei Bereichsüberschreitung des Arrays?</p>
<p>2. Wie kann ich die restlichen im Lesepuffer verbliebenen Zeichen löschen? Erst Fehlerbit mit cin.clear() löschen und dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119148</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Wed, 14 Sep 2011 09:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 09:53:32 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<p>TiSie schrieb:</p>
<blockquote>
<p>Liegt es vllt an der Entwicklungsumgebung? Arbeite mit Dev-C++</p>
</blockquote>
<p>Schau zu DEV-C++ mal ins Compiler/IDE-Forum weiter unten. Das Ding ist veraltet.</p>
<ol start="2">
<li>
<p>main hat einen Rückgabetyp. Wenn dein Compiler das ohne schluckt, solltest du ihn schleunigst wechseln.</p>
</li>
<li>
<p>system(&quot;pause&quot;) ist so eine Sache. Schau mal in die FAQ bzgl. &quot;Fenster schließt sich&quot; etc, da gibts Alternativen, die dazu auch noch portabel sind. (Oder starte dein Programm einfach aus der Konsole)</p>
</li>
<li></li>
</ol>
<blockquote>
<p>!(cin.getline(wandelZahl,21)=true</p>
</blockquote>
<p>getline gibt eine Referenz auf das Streamobjekt zurück. Der Ausdruck (wenn man ihn um die fehlende Klammer ersetzt) gibt true, wenn cin nach getline false ergibt. genauer, wenn irgendwas schief gelaufen ist. Was da bei getline schief laufen kann, sagt dir eine Referenz.</p>
<ol start="5">
<li></li>
</ol>
<blockquote>
<p>Wie kann ich die restlichen im Lesepuffer verbliebenen Zeichen löschen? Erst Fehlerbit mit cin.clear() löschen und dann?</p>
</blockquote>
<p>wie gehabt mit ignore. Als parameter wird gerne []std::numeric_limits&lt;unsigned&gt;::max()[/c] übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119157</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 14 Sep 2011 09:53:32 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 10:16:00 GMT]]></title><description><![CDATA[<p>Ob die IDE DEV besser geworden ist weiss ich nicht.<br />
Die Compiler ist aktueller.</p>
<p>Hier der Link:<br />
<a href="http://orwellengine.blogspot.com/2011_09_01_archive.html" rel="nofollow">http://orwellengine.blogspot.com/2011_09_01_archive.html</a></p>
<p>Aktuelle Version DEV-C++ 5.0.0.3 mit Datum 2011.sep.08</p>
<p>MfG f.-th.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119174</guid><dc:creator><![CDATA[f.-th.]]></dc:creator><pubDate>Wed, 14 Sep 2011 10:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 10:30:34 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<ol start="2">
<li>main hat einen Rückgabetyp. Wenn dein Compiler das ohne schluckt, solltest du ihn schleunigst wechseln.</li>
</ol>
</blockquote>
<p>Sollte er nicht deswegen, da sowohl im Sprachstandard C++ wie auch bei C99 ein implizites &quot;return 0&quot; spezifiziert ist bei Fehlen einer expliziten Angabe.<br />
Über Sinn und Unsinn dieses &quot;Features&quot; im Standard kann man sicher geteilter Meinung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119188</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Wed, 14 Sep 2011 10:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 10:46:04 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>Sollte er nicht deswegen, da sowohl im Sprachstandard C++ wie auch bei C99 ein implizites &quot;return 0&quot; spezifiziert ist bei Fehlen einer expliziten Angabe.<br />
Über Sinn und Unsinn dieses &quot;Features&quot; im Standard kann man sicher geteilter Meinung sein.</p>
</blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<ol start="2">
<li>main hat einen Rückgabe<strong>typ</strong>.</li>
</ol>
</blockquote>
<p>TiSie schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

main(){
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2119192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119192</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 Sep 2011 10:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 14:05:26 GMT]]></title><description><![CDATA[<p>TiSie schrieb:</p>
<blockquote>
<p>Hier nochmal den Code-Schnipsel als eigenes Programm (und fehlende Semikolons ergänzt). Funktioniert leider immer noch nicht. Liegt es vllt an der Entwicklungsumgebung? Arbeite mit Dev-C++</p>
</blockquote>
<p>Das scheint tatsächlich am Compiler zu liegen. Ich nehme an du arbeitest mit diesem frei erhältlichen gcc Ding. Und die interpretieren den Standard so, dass sie get_avil() bzw. showmanyc() einfach immer 0 zurückgeben lassen. Mit den Compilern von Microsoft funktioniert dein Ansatz.</p>
<p>D.h. du musst umdenken und es anders versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119300</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Wed, 14 Sep 2011 14:05:26 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf beim Char-Array on Wed, 14 Sep 2011 19:48:01 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<ol>
<li></li>
</ol>
<p>TiSie schrieb:</p>
<blockquote>
<p>Liegt es vllt an der Entwicklungsumgebung? Arbeite mit Dev-C++</p>
</blockquote>
<p>Schau zu DEV-C++ mal ins Compiler/IDE-Forum weiter unten. Das Ding ist veraltet.</p>
<ol start="2">
<li>
<p>main hat einen Rückgabetyp. Wenn dein Compiler das ohne schluckt, solltest du ihn schleunigst wechseln.</p>
</li>
<li>
<p>system(&quot;pause&quot;) ist so eine Sache. Schau mal in die FAQ bzgl. &quot;Fenster schließt sich&quot; etc, da gibts Alternativen, die dazu auch noch portabel sind. (Oder starte dein Programm einfach aus der Konsole)</p>
</li>
<li></li>
</ol>
<blockquote>
<p>!(cin.getline(wandelZahl,21)=true</p>
</blockquote>
<p>getline gibt eine Referenz auf das Streamobjekt zurück. Der Ausdruck (wenn man ihn um die fehlende Klammer ersetzt) gibt true, wenn cin nach getline false ergibt. genauer, wenn irgendwas schief gelaufen ist. Was da bei getline schief laufen kann, sagt dir eine Referenz.</p>
<ol start="5">
<li></li>
</ol>
<blockquote>
<p>Wie kann ich die restlichen im Lesepuffer verbliebenen Zeichen löschen? Erst Fehlerbit mit cin.clear() löschen und dann?</p>
</blockquote>
<p>wie gehabt mit ignore. Als parameter wird gerne []std::numeric_limits&lt;unsigned&gt;::max()[/c] übergeben.</p>
</blockquote>
<p>Alles klar! Jetzt läuft es wunderbar! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
Ich glaub bei der nächsten gelegenheit sollte ich mir mal den Microsoft-Compiler zulegen.<br />
Vielen Dank euch Allen für die wirklich konstruktive Hilfe! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2119468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119468</guid><dc:creator><![CDATA[TiSie]]></dc:creator><pubDate>Wed, 14 Sep 2011 19:48:01 GMT</pubDate></item></channel></rss>