<?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[Abfangen von Eingabefehlern]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte wissen ob man den Inhalt einer Variable darauf abfragen kann ob er nummerisch ist oder nicht?</p>
<p>Ich hatte die idee eingabefehler ungefähr so abzufangen:</p>
<pre><code class="language-cpp">char input;

while(input == &quot;nummerisch&quot;)
{
  std::cin &gt;&gt; input;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/200525/abfangen-von-eingabefehlern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 18:57:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200525.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 Dec 2007 12:25:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 12:25:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich wollte wissen ob man den Inhalt einer Variable darauf abfragen kann ob er nummerisch ist oder nicht?</p>
<p>Ich hatte die idee eingabefehler ungefähr so abzufangen:</p>
<pre><code class="language-cpp">char input;

while(input == &quot;nummerisch&quot;)
{
  std::cin &gt;&gt; input;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1421320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421320</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Sun, 16 Dec 2007 12:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 12:36:30 GMT]]></title><description><![CDATA[<p>isNumeric() ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421330</guid><dc:creator><![CDATA[Stelfer]]></dc:creator><pubDate>Sun, 16 Dec 2007 12:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 12:37:56 GMT]]></title><description><![CDATA[<p>Header: &lt;locale&gt;<br />
Function: isalpha(..)<br />
(C++ Runtime Library)</p>
<p>--------------------------------------------------------------------------------------------------------<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200516-and-start-is-10.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-200516-and-start-is-10.html</a><br />
Ah, ja?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421332</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 16 Dec 2007 12:37:56 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 13:01:23 GMT]]></title><description><![CDATA[<p>Naja kommt darauf an ob du das wirklich in dem Fall brauchst. Wenn du es einfach als falsche Eingabe behandelt haben willst, wenn keine Zahl eingegeben wird, dann guck mal in deinen anderen Thread dir die Funktion type und clear_stream an. Wenn es bei einem Eingabestream nicht möglich ist etwas einzulesen (in den entsprechenden Typ), wird ein failbit gesetzt. Das kannst du abfragen (fail() oder operator!, !good(), operator void* usw.). Wenn es gesetzt ist musst du den Stream aufräumen und das failbit wieder löschen. Dann kannst du es erneut versuchen. Bis die Eingabe korrekt ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421347</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 16 Dec 2007 13:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 14:53:10 GMT]]></title><description><![CDATA[<p>Ich habe versucht einen eingabefehler abzufangen:</p>
<pre><code class="language-cpp">unsigned int basis;
do
{
   std::cin &gt;&gt; basis;
   std::cout &lt;&lt; std::endl;

   if(isalpha(basis))
   {
      std::cout &lt;&lt; &quot;FEHLER: Falsche Eingabe!\n&quot;;
   }
}
while(isalpha(basis));
</code></pre>
<p>es hat nicht geklapt... <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="😞"
    /></p>
<p>das programm gibt nicht mal &quot;FEHLER: Falsche Eingabe!&quot; aus.<br />
Was habe ich falsch gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421390</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Sun, 16 Dec 2007 14:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 15:03:47 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/clibrary/cctype/isalpha.html" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cctype/isalpha.html</a><br />
isdigit ist wohl besser (mein fehler) als islapha.</p>
<p>Jedoch denke ich dass dein Test so nicht funktioniert, da std::cin &gt;&gt; basis; die gelesenen character gerade konvertiert, oder?</p>
<p>isdigit etc. nehmen als Argument ein unsigned int, jedoch ist das ein character (einfach ein Zeichen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421397</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 16 Dec 2007 15:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 15:11:02 GMT]]></title><description><![CDATA[<p>simon.gysi schrieb:</p>
<blockquote>
<p>Jedoch denke ich dass dein Test so nicht funktioniert, da std::cin &gt;&gt; basis; die gelesenen character gerade konvertiert, oder?</p>
<p>isdigit etc. nehmen als Argument ein unsigned int, jedoch ist das ein character (einfach ein Zeichen).</p>
</blockquote>
<p>du hast recht</p>
<p>hat jemand eine andere idee?</p>
<p>Weitere infos:<br />
es handelt sich um eine Benutzereingabe,<br />
ich muss damit noch rechnen(deswegen möchte ich auch verhindern, dass ein buchstabe gespeichert wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421401</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Sun, 16 Dec 2007 15:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 15:17:37 GMT]]></title><description><![CDATA[<p>isalpha, isdigit und konsorten überprüfen jeweils nur ein _zeichen_, also einen character. aber wenn du cin in einen int einlesen lässt, dann hast du kein zeichen eingelesen, sondern eine zahl - und die kann aus mehreren zeichen bestehen.</p>
<p>es kommt wohl genauer darauf an, welche eingabe du erwartest und wie du darauf reagieren willst.</p>
<p>wenn ein eingabestream ein problem mit dem lesen hat, dann wird entweder das fail- oder das badbit gesetzt (letzteres zeigt idR an, das man den stream nicht verwenden kann). da C++ relativ streng getypet ist, kannst du also in einen integer einlesen und via failbit überprüfen, ob die eingabe geklappt hat:</p>
<pre><code class="language-cpp">int i;
cin &gt;&gt; i;
if (cin.fail()) //eingabe hat nicht funktioniert.
</code></pre>
<p>streams bieten darüber hinaus noch die operatoren! und void*. damit ist es möglich, das ganze so zu vereinfachen:</p>
<pre><code class="language-cpp">int i;
cin &gt;&gt; i;
if (cin) //alles gut ...
if (!cin) //... oder nicht?
</code></pre>
<p>dann gibt es aber noch eine menge probleme, die bei einer falscheingabe auftreten können, wie z.b. überschüssige zeichen im puffer usw.</p>
<p>ich empfehle dir zur einführung: <a href="http://www.cs.rit.edu/~cs4/pub/doc/iostreams.html" rel="nofollow">http://www.cs.rit.edu/~cs4/pub/doc/iostreams.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421405</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 16 Dec 2007 15:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 15:23:25 GMT]]></title><description><![CDATA[<p>Also, nochmal:<br />
<a href="http://www.cplusplus.com/reference/clibrary/cctype/isalpha.html" rel="nofollow">std::isalpha</a> &lt;cctype&gt;</p>
<p>Wenn du bsw. folgendes hast:</p>
<pre><code class="language-cpp">#include &lt;cctype&gt;
#include &lt;iostream&gt;

int main()
{
    const char character('a');
    const char number('1');
    std::cout &lt;&lt; &quot;\'&quot; &lt;&lt; character &lt;&lt; &quot;\' is a number? &quot; &lt;&lt; std::isalpha(character) &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;\'&quot; &lt;&lt; number &lt;&lt; &quot;\' is a number? &quot; &lt;&lt; std::isalpha(number) &lt;&lt; std::endl;
}
</code></pre>
<p>.</p>
<p>Ein Eingabestring hat ja wie oben stehend ein good, ein fail und ein bad-bit. Das good-bit heißt, es ist alles in Ordnung. failbit, wenn etwas fehlgeschlagen ist. Badbit ist &quot;an error that caused the loss of integrity of the stream&quot;.</p>
<p>bad und failbit kannst du über fail und/oder bad abrufen:</p>
<pre><code class="language-cpp">unsigned int number(0);
std::cin &gt;&gt; number;
if (std::cin.fail() == true) std::cerr &lt;&lt; &quot;Es wurde keine Zahl eingegeben!&quot; &lt;&lt; std::endl;
</code></pre>
<p>.<br />
Nun wurde aber auch der operator! und operator void* überladen. operator! gibt true zurück, wenn fail oder badbit gesetzt ist. operator void* gibt einen Nullpointer zurück, wenn das fail oder badbit gesetzt ist.<br />
Deswegen können wir das auch so abfragen:</p>
<pre><code class="language-cpp">unsigned int number(0);
std::cin &gt;&gt; number;
if (!std::cin) std::cerr &lt;&lt; &quot;Es wurde keine Zahl eingegeben!&quot; &lt;&lt; std::endl;
</code></pre>
<p>Das Design der Streamklassen ist so, dass jeder Streamoperator wieder ein Streamobjekt zurückgibt, wodurch folgendes möglich ist.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Das &quot; &lt;&lt; &quot; ist &quot; &lt;&lt; 1 &lt;&lt; &quot; (eins) !&quot; &lt;&lt; std::endl;
</code></pre>
<p>. Wäre die Streamklasse nicht so designt, müsstest du immer folgendes machen:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; &quot;Das &quot;; std::cout &lt;&lt; &quot; ist &quot;; std::cout &lt;&lt; 1;
</code></pre>
<p>usw.</p>
<p>d.h. ist nun folgendes möglich:</p>
<pre><code class="language-cpp">unsigned int number(0);
if (!(std::cin &gt;&gt; number))std::cerr &lt;&lt; &quot;Es wurde keine Zahl eingegeben!&quot; &lt;&lt; std::endl;
</code></pre>
<p>.</p>
<p>Jetzt musst du noch wissen, dass man erst ein failbit löschen muss, damit du wieder sauber einlesen kannst. Das macht die Funktion clear.</p>
<pre><code class="language-cpp">std::cin.clear()
</code></pre>
<p>Eingabestreams sind gepuffert (zumindest im Falle von std::cin) und deswegen kann sich noch mist im Eingabepuffer befinden. Der muss da raus. Das geht mit ignore.</p>
<pre><code class="language-cpp">std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
</code></pre>
<p>Wobei durch std::numeric_limits<a href="std::streamsize" rel="nofollow">std::streamsize</a> ein Template genutzt wird, dass dir die Limitierungen eines Datentypes zeigt. (Oftmals werden einfach konstant Werte hinterlegt (durch Templatespezialisierungen)). max() ist dabei die obere Grenze.<br />
Die Anzahl der im Eingabepuffer befindlichen Daten kann schlecht größer sein als des Buffers Größe und von d.h. ... '\n' ist das Newline-Zeichen und sollte sich von alleine Erklären.</p>
<pre><code class="language-cpp">std::cin.clear();
std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
</code></pre>
<p>räumt also für und den Eingabestream wieder auf. Also machen wir uns da mal eine Funktion daraus, damit wir die auch öfters nutzen können.</p>
<pre><code class="language-cpp">std::istream&amp; clear_stream(std::istream&amp; in)
{ 
    in.clear();
    in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
    return in;
}
</code></pre>
<p>Nun hab ich ja oben bereits erwähnt, dass die Streamfunktionen meist alle schön eine Referenz von sich zurückgeben. Daran haben wir uns jetzt bei der clear_stream-Funktion auch gehalten. Das erlaubt uns aber noch eine Kürzung, da in.ignore ja wieder in zurückgibt.</p>
<pre><code class="language-cpp">std::istream&amp; clear_stream(std::istream&amp; in)
{ 
    in.clear();
    return in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
}
</code></pre>
<p>Hier könnte man nun mit dem Komma-Operator weiter kürzen, doch da einige in diesem Forum das als unübersichtlich und unprofessionel ansehen, lass ich das jetzt mal.</p>
<p>Nun haben wir unsere Funktion zum bereinigen des Streams bei Falscheingabe(clear_stream) und wir wissen wie wir falsche Eingabe aufspüren (operator!). Das kombinieren wir jetzt einfach:</p>
<pre><code class="language-cpp">unsigned int number(0);
while (!(std::cin &gt;&gt; number)) 
{ 
    std::cout &lt;&lt; &quot;Falsche Eingabe!&quot; &lt;&lt; std::endl;
    clear_stream(std::cin);
}
</code></pre>
<p>Wie man das weiter optimiert habe ich auch in einem anderen Thread schon gezeigt, weshalb ich hier da jetzt nicht genauer drauf eingehe. Wir können jetzt auch noch hingehen und nur Zahlen von 0 bis 1000 odg. zulassen:</p>
<pre><code class="language-cpp">unsigned int number(0);
while (!(std::cin &gt;&gt; number) || number &gt; 1000) 
{ 
    std::cout &lt;&lt; &quot;Falsche Eingabe!&quot; &lt;&lt; std::endl;
    clear_stream(std::cin);
}
</code></pre>
<p>.</p>
<p>Das sollte jetzt mal als Erklärung reichen ... und mein Können ist deinem ja, wie du in dem anderen Post festgestellt hast, bei weitem unterlegen. Von daher gehe ich davon aus das dir das alles schon klar war und du und jetzt nur nochmal testen wolltest. :xmas1:</p>
<p><strong>Bearbeitung</strong><br />
Mein Beitrag war wohl zu lang und ich hab zu lange beim Tippen gebraucht. Hab eure Antworten noch nicht gesehen gehabt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421407</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sun, 16 Dec 2007 15:23:25 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 15:37:13 GMT]]></title><description><![CDATA[<p>erstmal danke ich euch allen sehr</p>
<p>(D)Evil schrieb:</p>
<blockquote>
<p>Das sollte jetzt mal als Erklärung reichen ... und mein Können ist deinem ja, wie du in dem anderen Post festgestellt hast, bei weitem unterlegen. Von daher gehe ich davon aus das dir das alles schon klar war und du und jetzt nur nochmal testen wolltest. Weihnachten</p>
</blockquote>
<p>Ich glaube du hast mich falsch verstanden, oder ich habe mich falsch ausgedrückt, ich habe nicht an deinem können gezweifelt, ich wollte nur klarstellen, dass das können nichts mit dem alter zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421411</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Sun, 16 Dec 2007 15:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Abfangen von Eingabefehlern on Sun, 16 Dec 2007 23:35:35 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Mein Beitrag war wohl zu lang und ich hab zu lange beim Tippen gebraucht. Hab eure Antworten noch nicht gesehen gehabt!</p>
</blockquote>
<p>Hättest dir auch sparen können :p<br />
<a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1319931.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1319931.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1421734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1421734</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 16 Dec 2007 23:35:35 GMT</pubDate></item></channel></rss>