<?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[String To Long]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe hier eine kleine Beispielfunktion aus meinem Lehrbuch, die einen String in long konvertiert. Dazu habe ich einige Fragen:</p>
<pre><code class="language-cpp">long StrToLong(string str)
{
	register int i = 0;
	long vz = 1, zahl = 0;

	//for(i=0;i&lt;str.size() &amp;&amp; isspace(str[i]); ++i)
	//	; diese Zeilen kann man doch weglassen

	if (i &lt; str.size())
	{
		if( str[i] == '+' ) {vz = 1; ++i;}
		if( str[i] == '-' ) {vz = -1; ++i;}
	}

	for(; i &lt; str.size() &amp;&amp; isdigit(str[i]); ++i) 
		zahl = zahl * 10 + (str[i] - '0');    

	return vz * zahl;
}
</code></pre>
<p>1.) Die zwei kommentierten Zeilen sind im ursprünglichen Programm nicht kommentiert, sondern sind dazu da um &quot;Führende Zwischenraumzeichen zu überlesen&quot;. Was soll das bringen. Wenn ich sie kommentiere, dann funktioniert das Programm auch.</p>
<p>2.) Bei der zweiten for - Schleife liegt das eigentliche Problem. Die erste Grenze ist die Länge des Strings, was für mich einleuchtend ist. Soll &quot;&amp;&amp; isdigit(str[i])&quot; sichergehen,dass nur bis dahin gezählt wird, wo auch nur eine Zahl vorhanden ist und kein Buchstabe? Ich dachte, dass &quot;isdigit&quot; ein Makro ist, dass einen bool Wert zurück gibt. Darauf deutet ja auch schon der Name an. Welchen Wert gibt sie denn zurück?</p>
<p>3.) Eigentlich ist das doch keine richtige Typumwandlung, da auch hier von der impliziten Typumwandlung Gebrauch gemacht wird, oder? In der Anweisung der zweiten for-Schleife</p>
<p>4.) was soll das -'0' in der Anweisung der zweiten for-Schleife?</p>
<p>Vielen Dank für eure Hilfe<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251922/string-to-long</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 05:27:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251922.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Oct 2009 15:25:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 15:25:35 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe hier eine kleine Beispielfunktion aus meinem Lehrbuch, die einen String in long konvertiert. Dazu habe ich einige Fragen:</p>
<pre><code class="language-cpp">long StrToLong(string str)
{
	register int i = 0;
	long vz = 1, zahl = 0;

	//for(i=0;i&lt;str.size() &amp;&amp; isspace(str[i]); ++i)
	//	; diese Zeilen kann man doch weglassen

	if (i &lt; str.size())
	{
		if( str[i] == '+' ) {vz = 1; ++i;}
		if( str[i] == '-' ) {vz = -1; ++i;}
	}

	for(; i &lt; str.size() &amp;&amp; isdigit(str[i]); ++i) 
		zahl = zahl * 10 + (str[i] - '0');    

	return vz * zahl;
}
</code></pre>
<p>1.) Die zwei kommentierten Zeilen sind im ursprünglichen Programm nicht kommentiert, sondern sind dazu da um &quot;Führende Zwischenraumzeichen zu überlesen&quot;. Was soll das bringen. Wenn ich sie kommentiere, dann funktioniert das Programm auch.</p>
<p>2.) Bei der zweiten for - Schleife liegt das eigentliche Problem. Die erste Grenze ist die Länge des Strings, was für mich einleuchtend ist. Soll &quot;&amp;&amp; isdigit(str[i])&quot; sichergehen,dass nur bis dahin gezählt wird, wo auch nur eine Zahl vorhanden ist und kein Buchstabe? Ich dachte, dass &quot;isdigit&quot; ein Makro ist, dass einen bool Wert zurück gibt. Darauf deutet ja auch schon der Name an. Welchen Wert gibt sie denn zurück?</p>
<p>3.) Eigentlich ist das doch keine richtige Typumwandlung, da auch hier von der impliziten Typumwandlung Gebrauch gemacht wird, oder? In der Anweisung der zweiten for-Schleife</p>
<p>4.) was soll das -'0' in der Anweisung der zweiten for-Schleife?</p>
<p>Vielen Dank für eure Hilfe<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791446</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 12 Oct 2009 15:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 15:47:45 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>1.) Die zwei kommentierten Zeilen sind im ursprünglichen Programm nicht kommentiert, sondern sind dazu da um &quot;Führende Zwischenraumzeichen zu überlesen&quot;. Was soll das bringen. Wenn ich sie kommentiere, dann funktioniert das Programm auch.</p>
</blockquote>
<p>Dort werden führende Leerzeichen übersprungen. Stell deinem String mal ein paar Leerzeichen voran und lass dein Programm einmal mit den beiden Zeilen und einmal ohne laufen. Dann wirst du den Unterschied sehen.</p>
<blockquote>
<p>2.) Bei der zweiten for - Schleife liegt das eigentliche Problem. Die erste Grenze ist die Länge des Strings, was für mich einleuchtend ist. Soll &quot;&amp;&amp; isdigit(str[i])&quot; sichergehen,dass nur bis dahin gezählt wird, wo auch nur eine Zahl vorhanden ist und kein Buchstabe? Ich dachte, dass &quot;isdigit&quot; ein Makro ist, dass einen bool Wert zurück gibt. Darauf deutet ja auch schon der Name an. Welchen Wert gibt sie denn zurück?</p>
</blockquote>
<p>Wenn der Name nicht schon sprechend genug ist, schau in eine Referenz, beispielsweise <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a>. Da kann man lesen:</p>
<blockquote>
<p>int isdigit ( int c );</p>
<p>Checks if parameter c is a decimal digit character.</p>
<p>Decimal digits are any of: 0 1 2 3 4 5 6 7 8 9</p>
</blockquote>
<p>Was das soll, hast du korrekt erkannt: Es soll festgestell werden, wo die Zahl zu Ende ist.</p>
<blockquote>
<p>3.) Eigentlich ist das doch keine richtige Typumwandlung, da auch hier von der impliziten Typumwandlung Gebrauch gemacht wird, oder? In der Anweisung der zweiten for-Schleife</p>
</blockquote>
<p>Vorher hast du einen String, hinterher einen long. Wo ist dein Problem?</p>
<blockquote>
<p>4.) was soll das -'0' in der Anweisung der zweiten for-Schleife?</p>
</blockquote>
<p>In der ASCII Zeichentabelle kommen die einzelnen Ziffern nicht gleich am Anfang. Wenn man daher einzelne Zeichen als arithmetische Ziffern auffassen will, muss man den Wert der ersten Ziffer abziehen.<br />
Verstanden oder ist mehr Erklärung nötig?</p>
<p>Und allgemein: Du schreibst, dass dies aus einem Lehrbuch ist, deshalb nehme ich an, man soll den Algorithmus nachvollziehen. Das ist sicherlich sehr nützlich und das solltest du auch tun. Ich will aber noch anmerken, dass C++ natürlich auch Sprachelemente bietet, die diese Umwandlung schon vollautomatisch durchführen (siehe std::stringstream).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791461</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Oct 2009 15:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 15:50:33 GMT]]></title><description><![CDATA[<p>Was auskommentiert wurde kann Leerzeichen vor der brauchbaren Eingabe abfangen.</p>
<p>Der Rest ist keine gute Lösung. Die Subtraktion mit '0' basiert auf der ASCII-Zeichentabelle, was aber sehr fehleranfällig ist.</p>
<p>Man sollte anstatt dessen z.B. atol benutzen: <a href="http://www.cplusplus.com/reference/clibrary/cstdlib/atol/" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstdlib/atol/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791464</guid><dc:creator><![CDATA[retter]]></dc:creator><pubDate>Mon, 12 Oct 2009 15:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 16:53:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich verstehe diese Auskommentierung immer noch nicht. Auch wenn ich Leerzeichen der Zahl voranstelle, wird das Programm korrekt ausgeführt.<br />
Man kann ja sehen, dass die Schleife keine Anweisung besitzt, keine Variablen ändert und daher nur eine Verzögerung des Programms<br />
darstellt.</p>
<p>Ich meinte eigentlich, dass hier ja nur von der impliziten Typumwandlung Gebrauch gemacht wird. Diese Methode wandelt den Typ also nur um, weil<br />
sie sich auf die automatische Umwandlung stützt.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791494</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 12 Oct 2009 16:53:42 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 17:02:13 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Man kann ja sehen, dass die Schleife keine Anweisung besitzt, <strong>keine Variablen ändert</strong> und daher nur eine Verzögerung des Programms darstellt.</p>
</blockquote>
<p>Die Schleife ändert sehr wohl eine Variable nämlich <code>i</code> :</p>
<pre><code class="language-cpp">register int i = 0;
/* ... */
for(i=0;i&lt;str.size() &amp;&amp; isspace(str[i]); ++i)
    ;
/* ... */
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1791499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791499</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Mon, 12 Oct 2009 17:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 17:08:46 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ich meinte eigentlich, dass hier ja nur von der impliziten Typumwandlung Gebrauch gemacht wird. Diese Methode wandelt den Typ also nur um, weil sie sich auf die automatische Umwandlung stützt.</p>
</blockquote>
<p>In der zweiten for-Schleife wird gerechnet, da kannst du doch nicht von impliziter Typumwandung sprechen. Wo wäre denn deiner Meinung nach eine implizite Umwandlung, auf die sich dieser Algorithmus stützt?</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791506</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 12 Oct 2009 17:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 17:33:08 GMT]]></title><description><![CDATA[<p>teste mal _-666 ( wobei _ Leerzeichen entspricht )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791527</guid><dc:creator><![CDATA[deraufemmawatsonfappt]]></dc:creator><pubDate>Mon, 12 Oct 2009 17:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 18:33:28 GMT]]></title><description><![CDATA[<p>Wenn ich -666 inklusive Leerzeichen eingebe und beide Versionen damit teste (also einmal mit Kommentar und einam l nicht), dann kommt bei beiden das gleiche Ergebnis.</p>
<p>Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791570</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 12 Oct 2009 18:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 18:57:03 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?</p>
</blockquote>
<p>str ist zwar ein string, str[i] aber nicht - das ist ein char. Und somit wären wir wieder bei dem Thema, dass man solche Sachen in wenigen Sekunden in einer Referenz nachschlagen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791584</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Oct 2009 18:57:03 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 19:00:58 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Wenn ich -666 inklusive Leerzeichen eingebe und beide Versionen damit teste (also einmal mit Kommentar und einam l nicht), dann kommt bei beiden das gleiche Ergebnis.</p>
</blockquote>
<p>Dann sind die Leerzeichen bereits vorher aus dem String entfernt worden.</p>
<blockquote>
<p>Wenn ich str[i] einem long Wert zuweise, dann muss doch eine Typumwandlung erfolgen, denn str ist doch ein String. Was verstehe ich da falsch?</p>
</blockquote>
<p>Der string::operator[] liefert ein char, was bei einer Zuweisung auf eine Variable vom Typ long automatisch konvertiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791589</guid><dc:creator><![CDATA[retter]]></dc:creator><pubDate>Mon, 12 Oct 2009 19:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 19:14:26 GMT]]></title><description><![CDATA[<p>Und da ich schon ahne, was die nächste Frage sein wird: char ist ein integraler Datentyp (das heißt, verhält sich wie eine Ganzzahl). Man kann damit genauso rechnen wie mit int. Und genau das ist es, was bei dem Algorithmus passiert.</p>
<pre><code class="language-cpp">zahl * 10 + (str[i] - '0');
</code></pre>
<p>Zuerst wird von dem Wert von str[i] der Wert des chars '0' abgezogen. Die Idee dahinter ist, dass in der Zeichentabelle die Ziffern als 0123456789 angeordnet sind. Daher hat das Ergebnis der Subtraktion hinterher Werte zwischen 0 und 9. Danach wird das Ergebnis dann einem Stellenwertsystem entsprechend der Variablen zahl hinzugefügt.</p>
<p>Wie aber schon angemerkt wurde, muss man sich dazu auf eben genau diese Eigenschaft der Zeichentabelle verlassen können. Wenn man wirklich portabel programmieren möchte, sollte man daher die fertigen Funktionen zur Umwandlung benutzen oder etwas programmieren, dass diese Annahme nicht zwangsläufig macht.</p>
<p>Trotzdem ist die Funktion sehr gut als Anschauungsmaterial geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791596</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Oct 2009 19:14:26 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 19:26:40 GMT]]></title><description><![CDATA[<p>Hallo,<br />
achso...jetzt verstehe ich! Tja, SeppJ...du scheinst hellseherische Kräfte zu besitzen. Danke für die Antwort im Voraus!<br />
Erst die Antwort dann die Frage...interessante Reihenfolge!</p>
<p>[edit] Das hätte aber sogar ich gewusst <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>
<p>Vielen Dank --&gt; ihr seit toll<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791603</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 12 Oct 2009 19:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to String To Long on Mon, 12 Oct 2009 19:29:09 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie aber schon angemerkt wurde, muss man sich dazu auf eben genau diese Eigenschaft der Zeichentabelle verlassen können. Wenn man wirklich portabel programmieren möchte, sollte man daher die fertigen Funktionen zur Umwandlung benutzen oder etwas programmieren, dass diese Annahme nicht zwangsläufig macht.</p>
</blockquote>
<p>Man kann sich drauf verlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1791605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1791605</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 12 Oct 2009 19:29:09 GMT</pubDate></item></channel></rss>