<?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[Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird?]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt;

/* Programm bricht nicht ab, wenn n groeßer ist als der
 * Variablentyp speichern kann
 * z.B. fuer 4 Byte großes int darf die Eingabe fuer n nicht groesser
 * als 2147483647 sein
 */

using namespace std;

int main()
{
  int  n = 0;

   cout &lt;&lt; sizeof(n) &lt;&lt; endl;
  do
  {
    cout &lt;&lt; &quot;Geben sie Eine Zahl ein. (Abbruch mit 0) &quot;;
    cin &gt;&gt; n;
    cout &lt;&lt; endl;

    cout &lt;&lt; &quot;n = &quot; &lt;&lt; n &lt;&lt; endl;
  } while (n &gt; 0);

  return 0;
}
</code></pre>
<p>Wieso schneidet cin die Eingabe nicht einfach ab oder liefert eine Fehlermeldung, wenn der Wert zu groß ist?<br />
Stattdessen läuft das Programm einfach in einer Endlosschleife weiter.</p>
<p>Getestet habe ich es mit gcc 3.4.5 aus dem MinGW Paket unter Windows.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266234/warum-bricht-diese-funktion-nicht-ab-wenn-der-wertebereich-von-int-bei-der-eingabe-über-cin-überschritten-wird</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 10:23:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266234.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 May 2010 22:53:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Wed, 05 May 2010 22:53:09 GMT]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt;

/* Programm bricht nicht ab, wenn n groeßer ist als der
 * Variablentyp speichern kann
 * z.B. fuer 4 Byte großes int darf die Eingabe fuer n nicht groesser
 * als 2147483647 sein
 */

using namespace std;

int main()
{
  int  n = 0;

   cout &lt;&lt; sizeof(n) &lt;&lt; endl;
  do
  {
    cout &lt;&lt; &quot;Geben sie Eine Zahl ein. (Abbruch mit 0) &quot;;
    cin &gt;&gt; n;
    cout &lt;&lt; endl;

    cout &lt;&lt; &quot;n = &quot; &lt;&lt; n &lt;&lt; endl;
  } while (n &gt; 0);

  return 0;
}
</code></pre>
<p>Wieso schneidet cin die Eingabe nicht einfach ab oder liefert eine Fehlermeldung, wenn der Wert zu groß ist?<br />
Stattdessen läuft das Programm einfach in einer Endlosschleife weiter.</p>
<p>Getestet habe ich es mit gcc 3.4.5 aus dem MinGW Paket unter Windows.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893087</guid><dc:creator><![CDATA[Überlauf]]></dc:creator><pubDate>Wed, 05 May 2010 22:53:09 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Wed, 05 May 2010 23:04:49 GMT]]></title><description><![CDATA[<p>Wenn ein Fehler passiert beim Einlesen mit <code>std::cin</code> , dann wird der Stream als ungültig markiert. Jeder weitere Lesevorgang wird automatisch abgebrochen. <code>n</code> bleibt auf 0 und du hast deine Endlosschleife.</p>
<p>Du kannst entweder das Verhalten ändern, in dem du Exceptions fliegen lässt:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/exceptions/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions/</a></p>
<p>Oder du prüft jeweils auf die Gültigkeit des Streams und ob die Einleseoperation erfolgreich war. Danach setzt du den Stream wieder zurück:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/good/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/good/</a><br />
<a href="http://www.cplusplus.com/reference/iostream/ios/clear/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/clear/</a><br />
<a href="http://www.cplusplus.com/reference/iostream/istream/ignore/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/ignore/</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893088</guid><dc:creator><![CDATA[dravere_test]]></dc:creator><pubDate>Wed, 05 May 2010 23:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 02:45:25 GMT]]></title><description><![CDATA[<p>dravere_test schrieb:</p>
<blockquote>
<p>Wenn ein Fehler passiert beim Einlesen mit <code>std::cin</code> , dann wird der Stream als ungültig markiert. Jeder weitere Lesevorgang wird automatisch abgebrochen. <code>n</code> bleibt auf 0 und du hast deine Endlosschleife.</p>
</blockquote>
<p>Ok,aber wenn n auf 0 bleibt, warum habe ich dann eine Endlosschleife.<br />
Normalerweise würde das Programm die while Schleife dann verlassen müssen, wenn n 0 bleibt.</p>
<p>Aber genau das passiert ja nicht.<br />
n nimmt irgendeinen Wert an.</p>
<p>cin versucht also zu funktionieren und scheint den Lesepuffer durch den ersten überhohen Eingabewert immer ohne Eingabe von Enter zu füllen, so daß while nie abbrechen kann, da n immer einen Wert hat.</p>
<blockquote>
<p>Du kannst entweder das Verhalten ändern, in dem du Exceptions fliegen lässt:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/exceptions/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions/</a></p>
<p>Oder du prüft jeweils auf die Gültigkeit des Streams und ob die Einleseoperation erfolgreich war. Danach setzt du den Stream wieder zurück:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/good/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/good/</a><br />
<a href="http://www.cplusplus.com/reference/iostream/ios/clear/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/clear/</a><br />
<a href="http://www.cplusplus.com/reference/iostream/istream/ignore/" rel="nofollow">http://www.cplusplus.com/reference/iostream/istream/ignore/</a></p>
<p>Grüssli</p>
</blockquote>
<p>Danke, ich werde mir das mal durchlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893101</guid><dc:creator><![CDATA[Überlauf]]></dc:creator><pubDate>Thu, 06 May 2010 02:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 08:13:28 GMT]]></title><description><![CDATA[<p>Eh, ja, natürlich, die Schleife bricht ab, sofern du eine zu hohe Zahl gleich zu Beginn eingibst. Wenn du aber zuerst eine Zahl eingibst, welche gespeichert werden kann (z.B. 1234), und danach eine zu grosse Zahl (z.B. 9999999999999999999999999), dann befindest du dich in der Endlosschleife, weil <code>n</code> seinen alten Wert behält.</p>
<p>Also einfach gesagt: <code>n</code> behält seinen alten Wert, wenn die Eingabe ungültig ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893161</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 06 May 2010 08:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 21:23:15 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Eh, ja, natürlich, die Schleife bricht ab, sofern du eine zu hohe Zahl gleich zu Beginn eingibst. Wenn du aber zuerst eine Zahl eingibst, welche gespeichert werden kann (z.B. 1234), und danach eine zu grosse Zahl (z.B. 9999999999999999999999999), dann befindest du dich in der Endlosschleife, weil <code>n</code> seinen alten Wert behält.</p>
<p>Also einfach gesagt: <code>n</code> behält seinen alten Wert, wenn die Eingabe ungültig ist.</p>
<p>Grüssli</p>
</blockquote>
<p>Aber müßte dann nicht beim dritten mal die Schleife anhalten und nach einer weiteren Eingabe warten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893541</guid><dc:creator><![CDATA[Überlauf]]></dc:creator><pubDate>Thu, 06 May 2010 21:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 21:24:53 GMT]]></title><description><![CDATA[<p>Überlauf schrieb:</p>
<blockquote>
<p>Aber müßte dann nicht beim dritten mal die Schleife anhalten und nach einer weiteren Eingabe warten?</p>
</blockquote>
<p>Nein. Wenn der Stream ungültig ist, dann bleibt er ungültig, bis du ihn zurücksetzt. Wenn er ungültig ist, wird jede Operation darauf direkt verworfen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893542</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 06 May 2010 21:24:53 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 23:09:41 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Überlauf schrieb:</p>
<blockquote>
<p>Aber müßte dann nicht beim dritten mal die Schleife anhalten und nach einer weiteren Eingabe warten?</p>
</blockquote>
<p>Nein. Wenn der Stream ungültig ist, dann bleibt er ungültig, bis du ihn zurücksetzt. Wenn er ungültig ist, wird jede Operation darauf direkt verworfen.</p>
<p>Grüssli</p>
</blockquote>
<p>Verstehe, ich müßte also Sicherheitshalber so eine art cin.clear ausführen um die Schleife zu verhindern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893598</guid><dc:creator><![CDATA[Überlauf]]></dc:creator><pubDate>Thu, 06 May 2010 23:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Warum bricht diese Funktion nicht ab, wenn der Wertebereich von int bei der Eingabe über cin überschritten wird? on Thu, 06 May 2010 23:23:52 GMT]]></title><description><![CDATA[<p>Überlauf schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Überlauf schrieb:</p>
<blockquote>
<p>Aber müßte dann nicht beim dritten mal die Schleife anhalten und nach einer weiteren Eingabe warten?</p>
</blockquote>
<p>Nein. Wenn der Stream ungültig ist, dann bleibt er ungültig, bis du ihn zurücksetzt. Wenn er ungültig ist, wird jede Operation darauf direkt verworfen.</p>
<p>Grüssli</p>
</blockquote>
<p>Verstehe, ich müßte also Sicherheitshalber so eine art cin.clear ausführen um die Schleife zu verhindern?</p>
</blockquote>
<p>Ja. Jedoch sind die ungültigen Eingaben noch immer im Stream (sie wurden ja nicht gelesen!), d.h. der nächste Versuch wird wieder scheitern. Du müsstest daher noch festlegen, wie mit diesen Eingaben verfahren werden soll. Eine einfache aber effektive Möglichkeit ist ignore().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893601</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 May 2010 23:23:52 GMT</pubDate></item></channel></rss>