<?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[WEBCGI-Projekt | Verbesserungsvorschläge]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für das Fach Programmieren haben wir ein Projekt angefangen, welches sich mit WEB-CGI befasst. Wir sollen einen Online-Compiler entwickeln... Soweit so gut.</p>
<p>Mittlerweile sind wir fast fertig, es fehlt eigentlich nurnoch mein letzter Part... Ich soll eine Funktion schreiben, die aus einem Text einen Teilstring findet und diesen ersetzt.</p>
<p>Ich habe die Funktion mittlerweile fertig, brauche aber unbedingt noch Verbesserungsvorschläge. Was hab ich mir hier zu schwer / zu leicht gemacht, oder was kann man generell besser machen? Ist das überhaupt C++ und nicht ANSI C?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

char * suche(char * text, char * wort, char * ersetze)
{
	char * suchergebnis; // Hier wird spaeter nach (char * wort) gesucht
	char * neuertext; // Der neue Text

	int laenge = (strlen(text) - strlen(wort) + strlen(ersetze)) + 1; // Laenge von (char * neuertext)
	int i, j; // Zaehler

	neuertext = new char [laenge]; // dynamisch Speicher anfordern für (char * neuertext)

	suchergebnis = strstr(text, wort); // Es wird nach (char * wort) gesucht

	if (NULL == suchergebnis) return NULL; // Wort gefunden?

    for(i = 0; i &lt; (strlen(text)-strlen(suchergebnis)); i++)
	{
		neuertext[i] = text[i]; 
	}
	/* In dieser ersten Schleife kopieren wir den Ursprungstext
       bis zum ersten Vorkommen von (char * wort) in den neuen Text */

    for(j = 0; j &lt; strlen(ersetze); j++, i++)
	{
		neuertext[i] = ersetze[j];
	} 
	/* Die zweite Schleife kopiert das Ersatzwort ab dem ersten Vorkommen
       von (char * wort) in den neuen Text */

	for(j = strlen(text) - (strlen(suchergebnis) - strlen(wort)); text[j] != '\0'; i++, j++)
	{
		neuertext[i] = text[j];
	}
	/* Zu guter letzt wird der Rest des Ursprungstextes nach (char * wort) in
       den neuen Text kopiert */

	return neuertext; // Rueckgabe
}

int main()
{
	char text[] = &quot;&lt;title&gt;((TITLE))&lt;/title&gt;&quot;; // Ursprungstext
	cout &lt;&lt; suche(text, &quot;((TITLE))&quot;, &quot;Der Online-Compiler!&quot;) &lt;&lt; endl &lt;&lt; endl; // Funktionsaufruf

    system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Vielen Dank schonmal<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235294/webcgi-projekt-verbesserungsvorschläge</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:40:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235294.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Feb 2009 23:41:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 27 Feb 2009 23:41:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für das Fach Programmieren haben wir ein Projekt angefangen, welches sich mit WEB-CGI befasst. Wir sollen einen Online-Compiler entwickeln... Soweit so gut.</p>
<p>Mittlerweile sind wir fast fertig, es fehlt eigentlich nurnoch mein letzter Part... Ich soll eine Funktion schreiben, die aus einem Text einen Teilstring findet und diesen ersetzt.</p>
<p>Ich habe die Funktion mittlerweile fertig, brauche aber unbedingt noch Verbesserungsvorschläge. Was hab ich mir hier zu schwer / zu leicht gemacht, oder was kann man generell besser machen? Ist das überhaupt C++ und nicht ANSI C?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

char * suche(char * text, char * wort, char * ersetze)
{
	char * suchergebnis; // Hier wird spaeter nach (char * wort) gesucht
	char * neuertext; // Der neue Text

	int laenge = (strlen(text) - strlen(wort) + strlen(ersetze)) + 1; // Laenge von (char * neuertext)
	int i, j; // Zaehler

	neuertext = new char [laenge]; // dynamisch Speicher anfordern für (char * neuertext)

	suchergebnis = strstr(text, wort); // Es wird nach (char * wort) gesucht

	if (NULL == suchergebnis) return NULL; // Wort gefunden?

    for(i = 0; i &lt; (strlen(text)-strlen(suchergebnis)); i++)
	{
		neuertext[i] = text[i]; 
	}
	/* In dieser ersten Schleife kopieren wir den Ursprungstext
       bis zum ersten Vorkommen von (char * wort) in den neuen Text */

    for(j = 0; j &lt; strlen(ersetze); j++, i++)
	{
		neuertext[i] = ersetze[j];
	} 
	/* Die zweite Schleife kopiert das Ersatzwort ab dem ersten Vorkommen
       von (char * wort) in den neuen Text */

	for(j = strlen(text) - (strlen(suchergebnis) - strlen(wort)); text[j] != '\0'; i++, j++)
	{
		neuertext[i] = text[j];
	}
	/* Zu guter letzt wird der Rest des Ursprungstextes nach (char * wort) in
       den neuen Text kopiert */

	return neuertext; // Rueckgabe
}

int main()
{
	char text[] = &quot;&lt;title&gt;((TITLE))&lt;/title&gt;&quot;; // Ursprungstext
	cout &lt;&lt; suche(text, &quot;((TITLE))&quot;, &quot;Der Online-Compiler!&quot;) &lt;&lt; endl &lt;&lt; endl; // Funktionsaufruf

    system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Vielen Dank schonmal<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671738</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Fri, 27 Feb 2009 23:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 27 Feb 2009 23:57:49 GMT]]></title><description><![CDATA[<p><strong>Ob es C++ oder C ist?</strong><br />
Also wenn man new und das nicht vorhandene delete[] (-&gt; Speicherleck) durch malloc und free, cout und endl durch printf, &lt;string&gt; durch &lt;string.h&gt; und &lt;iostream&gt; durch &lt;stdio.h&gt; ersetzt, dann hast du ein vollständiges C Programm.<br />
Anders gesagt, du hast hier so gut wie kein C++ benutzt und erzeugst zudem noch ein Speicherleck. <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>
<p><strong>Verbesserungsvorschläge?</strong><br />
Verwende die Klasse <code>std::string</code> :<br />
<a href="http://www.cplusplus.com/reference/string/string/" rel="nofollow">http://www.cplusplus.com/reference/string/string/</a></p>
<p>Da gibt es eine Funktion <code>replace</code> :<br />
<a href="http://www.cplusplus.com/reference/string/string/replace.html" rel="nofollow">http://www.cplusplus.com/reference/string/string/replace.html</a></p>
<p>Auf <code>system</code> sollte man verzichten, aber ich nehme mal an, dass du es nur drin hast, um zu testen. Hier andere Möglichkeiten um das automatische schliessen zu verhindern und da drin ist auch ein Link, wieso man auf <code>system</code> verzichten sollte:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html</a></p>
<p>Ansonsten, wenn du dann den C++ Code hast, können wir ja mal weiterschauen. <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1671745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1671745</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 27 Feb 2009 23:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sat, 28 Feb 2009 17:13:36 GMT]]></title><description><![CDATA[<p>Vielen Dank erstmal für deine Antwort,</p>
<p>also das sieht ja schonmal viel besser, unkomplizierter und kompakter aus mit Strings.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

string ersetze(string ursprungstext, string suchwort, string ersatzwort)
{
	string neuertext;

    neuertext = ursprungstext.replace(ursprungstext.find(suchwort), suchwort.length(), ersatzwort);

    return neuertext;
}
</code></pre>
<p>Funktionsaufruf in der Main folgendermaßen:</p>
<pre><code class="language-cpp">ersetze(&quot;Foo Bar&quot;, &quot;Foo&quot;, &quot;Ich zahle gern in&quot;
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>Ich zahle gern in Bar</p>
</blockquote>
<p>Jetzt gibt es allerdings ein Problem...<br />
cin.getline funktioniert nicht mit Strings sondern nur mit char-Arrays, und cin liest keine Whitespace-Zeichen (Leerzeichen)</p>
<pre><code class="language-cpp">int main()
{
	string text, suchwort, ersatzwort;

	cout &lt;&lt; &quot;Text:\t&quot;;
	cin.getline(text, 200000);

	cout &lt;&lt; &quot;Suchwort:\t&quot;;
	cin.getline(suchwort, 50);

	cout &lt;&lt; &quot;Ersatzwort:\t&quot;;
	cin.getline(ersatzwort, 50);

  cout &lt;&lt; ersetze(text, suchwort, ersatzwort) &lt;&lt; endl &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Hier wird ein Fehler ausgespuckt...</p>
<blockquote>
<p>21 E:\Programme\Dev-Cpp\main.cpp no matching function for call to `std::basic_istream&lt;char, std::char_traits&lt;char&gt; &gt;::getline(std::string&amp;, int)'</p>
</blockquote>
<p>Wie kann ich also jetzt einen Text einlesen?</p>
<p>Oder soll ich von char in String konvertieren? (wie das geht, weiß ich leider auch noch nicht, googlen wäre aber kein Problem)</p>
<p>MfG,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672066</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Sat, 28 Feb 2009 17:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sat, 28 Feb 2009 18:11:01 GMT]]></title><description><![CDATA[<p>Im Header <code>&lt;string&gt;</code> wird eine freie Funktion mit dem Namen <code>std::getline</code> definiert:<br />
<a href="http://www.cplusplus.com/reference/string/getline.html" rel="nofollow">http://www.cplusplus.com/reference/string/getline.html</a></p>
<p>Die könnte hilfreich sein <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672101</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 28 Feb 2009 18:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sat, 28 Feb 2009 18:22:05 GMT]]></title><description><![CDATA[<p>Habe ich auch gerade gefunden,<br />
trotzdem vielen Dank, warst sehr hilfreich! <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>
<p>Ist mein Programm denn jetzt in C++, oder immernoch C?</p>
<p>Mit freundlichen Grüßen<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672103</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Sat, 28 Feb 2009 18:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sat, 28 Feb 2009 18:59:05 GMT]]></title><description><![CDATA[<p>root2k schrieb:</p>
<blockquote>
<p>Ist mein Programm denn jetzt in C++, oder immernoch C?</p>
</blockquote>
<p>Jetzt ist glaub ich alles C++, soweit ich das erkennen kann. Und nun gebe ich auch gerne ein paar Ratschläge <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>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

// using namespace std;
// Ich würde mit dem hier vorsichtig umgehen.
// Hier kein Problem, aber nie damit in einen Header,
// und daran denken, dass man damit Namenskonflikte
// hervorrufen kann.

// Ich nehme nun die Variablen in englisch, klingt irgendwie
// besser mit all den englischen Schlüsselwörter :)

// Deklaration (auch mehr einfach aus Stilgründen):
std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement);

// Die konstanten Referenzen sind aber empfehlenswert.
// So wird nicht eine Kopie gemacht, sondern mit dem gleichen
// Objekt gearbeitet, welches von Aussen kommt. Es ist allerdings
// garantiert, dass dieses Objekt nicht verändert wird.

int main()
{
  std::cout &lt;&lt; &quot;Text:\t&quot;;

  std::string text; // In C++ kann man eine Variable auch erst dann
                    // deklarieren, wenn man sie braucht.
  std::getline(std::cin, text);

  std::cout &lt;&lt; &quot;Suchwort:\t&quot;;

  std::string searchTerm;
  std::getline(std::cin, searchTerm);

  std::cout &lt;&lt; &quot;Ersatzwort:\t&quot;;

  std::string replacement;
  std::getline(std::cin, replacement);

  std::cout &lt;&lt; replace(text, searchTerm, replacement)
            &lt;&lt; '\n'
            &lt;&lt; std::endl;

  // std::endl fügt nicht nur eine neue Linie ein,
  // sondern führt auch noch ein flush durch.
  // Deshalb wurde das erste std::endl durch ein '\n',
  // bzw. Linefeed, ersetzt.

  return 0;
  // return 0 ist bei der main Funktion nicht unbedingt nötig.
}

std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement)
{
  // Kopie von text erstellen, da wir auf diesem nicht arbeiten können.
  // Es ist ja eine konstante Referenz.
  std::string result = text;

  // Wir verändern result und geben es danach zurück.
  return result.replace(
                  text.find(searchTerm),
                  searchTerm.length(),
                  replacement);
}
</code></pre>
<p>So wird übrigens nur das erste Vorkommen von searchTerm ersetzt. Was dein ursprünglicher Code allerdings auch gemacht hat. Nur ist das auch gewollt? Sonst müsstest du es halt in einer Schlaufe durchlaufen lassen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672123</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 28 Feb 2009 18:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sat, 28 Feb 2009 23:06:41 GMT]]></title><description><![CDATA[<p>Wooooow!</p>
<p>Danke für deine Tipps, ich denke die stilvolle Programmierung ist ein neuer Weg bzw. eine neue Herausforderung für mich, die ich mir auf jeden Fall aneignen sollte. Wir haben es leider nicht anders beigebracht bekommen, auch in meinem C++ Buch steht es nicht anders <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="😞"
    /> Kannst du mir eventuell ein gutes Buch empfehlen, welches ein wenig Stil in die Sache bringt?</p>
<p>Vielen Dank!</p>
<p>Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672214</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Sat, 28 Feb 2009 23:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sun, 01 Mar 2009 02:21:02 GMT]]></title><description><![CDATA[<p>root2k schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Stil ist eine ganz eigene Sache, deswegen habe ich es auch gekennzeichnet, da es eher Nebensächlich ist. Es gibt nicht DEN Stil, im Gegenteil, alle sind anderer Meinung, was den richtigen Stil betrifft. Und wenn man darüber anfängt zu diskutieren, werfen sich die Leute am Ende Granaten an die Köpfe <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>
<p>Grundsätzlich denke ich, kann man ein paar Grundpunkte nennen:<br />
1. Dein Stil sollte einheitlich sein.<br />
2. Den Code nach Scopes einrücken.<br />
3. Eine Zeilenbreite zwischen 80 - 120 Zeichen anvisieren.<br />
4. Der Stil muss für dich oder dein Team stimmen. Er sollte die Lesbarkeit unterstützen. Ein guter Stil hast du meiner Meinung nach dann, wenn du ein Projekt während einem Jahr auf die Seite legst und danach dich leicht wieder in den Code einarbeiten kannst, da dein Code gut strukturiert ist.<br />
5. Ein Stil entwickelt sich über die Zeit und man sollte sich nicht scheuen, seinen Stil mal etwas anzupassen und/oder verändern.</p>
<p>Ein Buch zu C++ Stil gibt es in diesem Sinne glaube ich nicht. Aber ich glaube dir würde so oder so ein C++ Buch für die Grundlagen gut tun. Für Grundlagen werden hier oft die folgenden zwei empfohlen:<br />
- C++ Primer<br />
- Thinking in C++ 1 &amp; 2</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672246</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 01 Mar 2009 02:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sun, 01 Mar 2009 22:34:57 GMT]]></title><description><![CDATA[<p>Hallo nochmal und danke,</p>
<p>eine Frage habe ich da noch - wie schaffe ich es, eine Fehlermeldung auszugeben, wenn das Suchwort nicht gefunden wurde? Im Moment beendet er das Programm dann einfach...</p>
<p>Probiert habe ich schon folgendes...</p>
<pre><code class="language-cpp">std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement)
{
  std::string result = text;
  std::string errormsg = &quot;Das gesuchte Zeichenfragment wurde nicht gefunden.&quot;;

  if ( text.find(searchTerm) == NULL ) return errormsg;

  return result.replace(
                  text.find(searchTerm),
                  searchTerm.length(),
                  replacement);
}
</code></pre>
<p>Doch auch hier wird das Programm einfach beendet. Was gibt <code>text.find(searchTerm) == NULL</code> aus, wenn nichts gefunden wurde?</p>
<p>MfG, Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672565</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Sun, 01 Mar 2009 22:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sun, 01 Mar 2009 22:40:52 GMT]]></title><description><![CDATA[<p>Du solltest dich mit den Funktionen, die du verwendest, ein wenig vertraut machen (z.B. <a href="http://www.cplusplus.com/reference/string/string/find.html" rel="nofollow">hier</a>). <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>
<p>Du musst nämlich nicht auf NULL prüfen... Ausserdem solltest du <code>find()</code> besser nicht zwei Mal aufrufen, da es dann nochmals von vorne mit O(n) im String sucht.</p>
<p>Um einen Fehler kennzuzeichnen, gibt es in C++ verschiedene Möglichkeiten. Entweder du handhabst ihn gleich lokal, d.h. gibst eine Fehlermeldung aus und erwartest nochmals eine Eingabe (durch eine Schleife, die du erst bei gefundenem Eintrag beendest). Oder du verschachtelst das Ganze in eine Funktion und prüfst den Rückgabewert. Oder du verwendest Exceptions, die du dann irgendwo fangen musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672567</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 01 Mar 2009 22:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Sun, 01 Mar 2009 23:12:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement)
{
  std::string result = text;

  std::size_t errorchk = text.find(searchTerm);

  if ( errorchk == std::string::npos )
     return &quot;Das gesuchte Zeichenfragment wurde nicht gefunden.&quot;;

  return result.replace(
                  errorchk,
                  searchTerm.length(),
                  replacement);
}
</code></pre>
<p>Habs jetzt so gelöst, denkst du das geht in Ordnung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672576</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Sun, 01 Mar 2009 23:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 00:23:29 GMT]]></title><description><![CDATA[<p>root2k schrieb:</p>
<blockquote>
<p>Habs jetzt so gelöst, denkst du das geht in Ordnung?</p>
</blockquote>
<p>Die Lösung ist eher schlecht. Man erwartet im Rückgabewert nicht eine Fehlermeldung, sondern das Resultat. Zudem ist es schwer diesen Rückgabewert zu prüfen, ob es nun einen Fehler gab. Ich persönlich würde gleich die Funktionalität von <code>std::string::replace</code> ausnutzen. Wenn <code>std::string::find</code> ein <code>std::string::npos</code> zurückliefert und man dieses an <code>std::string::replace</code> übergibt, dann wird eine <code>std::out_of_range</code> Exception geworfen. Dies kannst du in der <code>main</code> abfangen und entsprechend darauf reagieren.</p>
<pre><code class="language-cpp">// replace wie ich es aufgezeigt hatte

int main()
{
  // ... bekannter Code

  try
  {
    std::cout &lt;&lt; replace(text, searchTerm, replacement)
              &lt;&lt; '\n'
              &lt;&lt; std::endl;
  }
  catch(std::out_of_range&amp;)
  {
    // Sinnvolle Fehlermeldung ...
    std::cerr &lt;&lt; &quot;!!!FEHLER; FEHLER; FEHLER!!!&quot; &lt;&lt; std::endl;

    // SINNVOLLE! :)
  }

  return 0;
}
</code></pre>
<p><code>std::cerr</code> ist im übrigen die Ausgabe für Fehlermeldungen. Dies geht an einen eigenen Puffer, welcher zum Teil mit dem von <code>std::cout</code> übereinstimmt. Wenn man die Ausgabe allerdings auf der Konsole umleitet, dann ist es gut möglich, dass das Zeug von <code>std::cerr</code> auf der Konsole erscheint, <code>std::cout</code> allerdings umgeleitet wird:<br />
<a href="http://www.cplusplus.com/reference/iostream/cerr.html" rel="nofollow">http://www.cplusplus.com/reference/iostream/cerr.html</a><br />
<a href="http://www.cplusplus.com/reference/iostream/cout.html" rel="nofollow">http://www.cplusplus.com/reference/iostream/cout.html</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672591</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 02 Mar 2009 00:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 14:26:27 GMT]]></title><description><![CDATA[<p>Schönen Dank für eure schnellen Antworten,</p>
<p>habe das jetzt mal so gemacht, jedoch funktioniert das Kompilieren nicht...</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement);

int main()
{
  std::cout &lt;&lt; &quot;Text:\t&quot;;
  std::string text;
  std::getline(std::cin, text);

  std::cout &lt;&lt; &quot;Suchwort:\t&quot;;
  std::string searchTerm;
  std::getline(std::cin, searchTerm);

  std::cout &lt;&lt; &quot;Ersatzwort:\t&quot;;
  std::string replacement;
  std::getline(std::cin, replacement);

  try
  {
    std::cout &lt;&lt; replace(text, searchTerm, replacement)
              &lt;&lt; '\n'
              &lt;&lt; std::endl;
  }
  catch(std::out_of_range&amp;)
  {
    std::cerr &lt;&lt; searchTerm
              &lt;&lt; &quot; wurde leider nicht im Text gefunden.&quot;
              &lt;&lt; std::endl;
  }

  system(&quot;PAUSE&quot;);
  return 0;
}

std::string replace(
  std::string const&amp; text,
  std::string const&amp; searchTerm,
  std::string const&amp; replacement)
{
  std::string result = text;

  return result.replace(
                  text.find(searchTerm),
                  searchTerm.length(),
                  replacement);
}
</code></pre>
<p>Compiler: Bloodshed Dev-C++</p>
<blockquote>
<p>E:\Programme\Dev-Cpp\main.cpp In function <code>int main()': 30 E:\\Programme\\Dev-Cpp\\main.cpp</code>std::out_of_range' has not been declared<br />
30 E:\Programme\Dev-Cpp\main.cpp invalid catch parameter<br />
E:\Programme\Dev-Cpp\Makefile.win [Build Error] [main.o] Error 1</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1672843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672843</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Mon, 02 Mar 2009 14:26:27 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 14:31:59 GMT]]></title><description><![CDATA[<p>Okay, das hat sich erledigt, in der Referenz steht, dass folgende Bibliothek eingebunden werden muss:</p>
<pre><code class="language-cpp">#include &lt;stdexcept&gt;
</code></pre>
<p><a href="http://www.cplusplus.com/reference/std/stdexcept/out_of_range.html" rel="nofollow">out_of_range - C++ Reference</a></p>
<p>Danach hat es funktioniert... Vielen Dank nochmal! Sieht so sehr ordentlich aus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672852</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Mon, 02 Mar 2009 14:31:59 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 15:14:25 GMT]]></title><description><![CDATA[<p>root2k schrieb:</p>
<blockquote>
<p>Compiler: Bloodshed Dev-C++</p>
</blockquote>
<p>Wenn ich noch einen Tipp geben darf. Wirf dieses Ding weg. Es gilt als veraltet und wird zudem nicht mehr weiterentwickelt. MAn sollte sich also davon lösen. Gratis C++ IDEs gibt es auch aktuellere:<br />
- Microsoft Visual Studio 2008 Express (ja, ist wirklich gratis! Und auf Windows sehr zu empfehlen.)<br />
- Code::Blocks - Platformunabhängig, kombinierbar mit gcc (g++ &amp; gdb)</p>
<p>root2k schrieb:</p>
<blockquote>
<p>Okay, das hat sich erledigt, in der Referenz steht, dass folgende Bibliothek eingebunden werden muss:</p>
</blockquote>
<p>Das nennt man übrigens nicht eine Bibliothek, sondern einen Header. Der Header gehört zur Standardbibliothek. Also eine Bibliothek ist immer eine Sammlung von Funktionen, Klassen usw., während ein Header Teil einer Bibliothek ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672885</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 02 Mar 2009 15:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 15:23:11 GMT]]></title><description><![CDATA[<p>Header, nicht Bibliothek. Okay, das kann ich mir merken. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> <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>
<p>Alles klar, hab Dev-C++ mal deinstalliert und im Gegenzug Microsoft Visual Studio 2008 Express heruntergeladen. Danke für den Tipp <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>
<p>MfG, Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672896</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Mon, 02 Mar 2009 15:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Mon, 02 Mar 2009 19:14:14 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Also eine Bibliothek ist immer eine Sammlung von Funktionen, Klassen usw., während ein Header Teil einer Bibliothek ist.</p>
</blockquote>
<p>Muss nicht sein. <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="😉"
    /><br />
Ein/mehrere Header kann/können sehr wohl eine ganze Bibliothek sein. (ist es meistens natürlich nicht so, dass sonst nichts migeliefert wird, aber so endgültige würde ich das nicht sagen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1673067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1673067</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 02 Mar 2009 19:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Thu, 05 Mar 2009 00:51:34 GMT]]></title><description><![CDATA[<p>Vielen Dank euch nochmal... Die Ersetzen-Funktion klappt einwandfrei. Leider darf ich momentan keine String-Klasse benutzen, da wir noch keine OOP gemacht haben und da erst noch zu kommen.</p>
<p>Funktioniert aber trotzdem und ich bin den anderen ein wenig voraus <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>
<p>Jetzt kommt das nächste Problem... Ich soll einen Parser schreiben, der Hexcode in Sonderzeichen rückwandelt... Der vom Benutzer eingegebene Quelltext hat ja Sonderzeichen. Diese werden aber bei der Übertragung in Hexcode umgewandelt ... z.B. das Ausrufezeichen &quot;!&quot; wird zu &quot;%21&quot; usw...</p>
<p>Folgendes habe ich mal probiert (entschuldigt den unglaublich schlecht strukturierten Code, das mache ich immer nachdem alles funktioniert^^)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

char hexToAscii(const char* code);
char* changeText (char* text);

int main()
{
	char* text = &quot;Aber hallo%3f Das ist ja gut zu wissen%21&quot;;

	std::cout		&lt;&lt; changeText(text)
					&lt;&lt; &quot;\n&quot;
					&lt;&lt; std::endl;
}

char * changeText (char * text)
{
	int i = 0, j = 0;
	int searchResLen = 0;
	int textLen = strlen(text);
	char * searchRes;
	char * newText = new char [textLen];

	searchRes = strstr(text, &quot;%&quot;);
	searchResLen = strlen(searchRes);

	for (; text[j] != NULL; i++, j++)
	{
		if (j == textLen-searchResLen)
		{
			newText[i] = hexToAscii(searchRes);
			j += 2;
		}
		else
		{
			newText[i] = text[j];
		}
	}

	newText[i] = '\0';

	return newText;
}

char hexToAscii(const char* code)
{
	char hex[5], *stop;
	hex[0] = '0';
	hex[1] = 'x';
	hex[2] = code[1];
	hex[3] = code[2];
	hex[4] = 0;

	return strtol(hex, &amp;stop, 16);
}
</code></pre>
<blockquote>
<p>Ausgabe: Aber hallo? Das ist ja gut zu wissen%21</p>
</blockquote>
<p>Die Funktion hexToAscii bekommt von der Funktion changeText das Suchergebnis von <code>strstr(text, &quot;%&quot;)</code> und gibt das hex-Array an die Funktion <code>strtol</code> weiter, welche dann das Sonderzeichen rückliefert.</p>
<p>Das Programm funktioniert nun aber nur bis zum ersten Sonderzeichen. Danach nicht mehr... ich weiß warum es nicht funktioniert (ich müsste ja mehrmals Suchergebnisse haben), aber ich habe keine Ahnung wie ich es machen soll? Kann mir vielleicht jemand einleuchten?</p>
<p>Danke schonmal<br />
der Kev</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674419</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Thu, 05 Mar 2009 00:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Thu, 05 Mar 2009 20:47:39 GMT]]></title><description><![CDATA[<p><strong>1.</strong> Neues Problem -&gt; Neuer Thread<br />
Das ist auch für dich sinnvoll. Gibt viele Leute, welche ab einem gewissen Zeitpunkt in einem grössen Thread nicht mehr unbedingt reinschauen. Zudem ist es eine besser Ordnung, auch wenn jemand nach einem Problem sucht.<br />
<strong>2.</strong> Keine String-Klasse benutzen, kein OOP? Ok, ich versteh schon. Ein Lehrer, welcher seinen Schülern C with Classes als C++ verkauft. In C++ kann man völlig unabhängig von C Programmieren. Um C++ zu beherrschen, muss man nicht C verstehen. Grundsätzlich sind es unabhängig Sprachen. Aber naja, wir sind uns in dem Forum ja daran gewöhnt, dass wir immer wieder von solchen Lehrern hören. Die sind leider Standard ... Fortbildung ist halt immer so eine Sache bei den Leuten.<br />
<strong>3.</strong> Zu deinem Problem. Alles was du eigentlich machen müsstest ist, dass du changeText mehrmals aufrufst, bis alle Zeichen ersetzt sind. Du könntest auch sowas intern machen, also in changeText selber, in dem du immer wieder nach dem Prozentzeichen suchst, die Umwandlung machst usw., bis es kein Prozentzeichen mehr findet. Du solltest zudem noch dein Speicherleck schliessen. In der Funktion wird Speicher über new reserviert und nirgends per delete freigegeben.<br />
<strong>4.</strong> Die Leute im Forum werden mich womöglich lynchen. Ich finde aber du hast schon Initiative gezeigt und ich hatte gerade Lust, dazu was zu schreiben oder zusammenzustellen. Es ist nicht gerade ausserordentlich toll, da ich nicht so der C Programmierer bin, aber ich denke es dürfte interessant für dich sein:</p>
<pre><code class="language-cpp">//#include &lt;string&gt;   -&gt; Du benutzt ja keine C++ Strings.
#include &lt;iostream&gt;
//#include &lt;iomanip&gt;  -&gt; brauchst du doch gar nicht.
//                       std::endl ist in &lt;iostream&gt; drin
//#include &lt;stdio.h&gt;  -&gt; falsch, in C++ ist es &lt;cstdio&gt;
//                       du benötigst es aber gar nicht.
//#include &lt;stdlib.h&gt; -&gt; falsch, in C++ ist es &lt;cstdlib&gt;
#include &lt;cstdlib&gt;
#include &lt;cstring&gt; // -&gt; Um mit C-Strings zu arbeiten.
#include &lt;cassert&gt; // -&gt; Im Debugmodus kann man damit
//                       Sicherheitsprüfungen durchführen.

// Kopf bleibt gleich.
char hexToAscii(char const* code);

// Den Text übergibt man als konstant, er soll in der Funktion
// schliesslich nicht verändert werden, sondern wird in einen
// neuen Puffer kopiert.
// Um Speicherlecks zu verhindern, muss der Anwender der
// Funktion einen genügend grossen Speicherblock übergeben.
// Dieser Puffer wird an dest übergeben.
void changeText(char* dest, char const* text);

int main()
{ 
	// Man sollte ein Zeiger auf ein String-Literal
	// als ein Zeiger auf konstanten Inhalt deklarieren.
	// Es ist nämlich auch der Fall.
	// Dass es anders geht, liegt nur an einer rückwärts-
	// kompatibilität zu C.
	char const* text = &quot;Aber hallo%3f Das ist ja gut zu wissen%21&quot;;

	// Wir erstellen uns nun ausserhalb Speicher,
	// damit wir ihn auch wieder sauber aufräumen können.
	// Nicht vergessen, zu dem new kommt ein delete.
	// Der neue Text wird sicher kürzer oder gleichlang sein
	// wie der alte Text. Also definieren wir einen
	// Puffer, mit gleicher Grösse.
	// strlen zählt die Null-Terminierung nicht mit,
	// deshalb zählen wir noch eins dazu.
	// Dies ist nötig, falls es keine zu ersetzenden
	// Hexadezimalzahlen hat. Es gäbe es einen Überlauf
	// mit undefiniertem Verhalten.
	char* buffer = new char[strlen(text) + 1];

	// Text wird geändert und in buffer geschrieben.
	changeText(buffer, text);

	// Der Puffer wird ausgegeben. changeText hat eine
	// terminierende 0 reingeschrieben, wodurch wir
	// den Puffer als C-String behandeln können.
	std::cout &lt;&lt; buffer &lt;&lt; std::endl;

	delete[] buffer; // &lt;- Das wichtige Delete, welches
	                 // vorhin fehlte.
}

// Zu den Funktionen :)

void changeText(char* dest, char const* text)
{
	// &lt;cassert&gt; wird hier z.B. verwendet.
	// Man hat ein Makro assert, welches etwas prüft
	// und wenn es den Wert false ergibt, bricht das Programm ab.
	// Diese Prüfung wird nur im Debugmodus durchgeführt.
	assert(0 != dest &amp;&amp; 0 != text);

	// Es wird also geprüft,
	// ob beide Zeiger keine Nullzeiger sind.
	// Man könnte hier durchaus noch mehr Prüfungen machen,
	// bzw. auch im Verlauf der Funktion.

	// Wir müssen nun also kopieren und wenn wir
	// ein '%' finden, müssen wir entsprechend dieses
	// Zeichen ignorieren und die nächsten zwei Buchstaben
	// als Hexadezimalziffern interpretieren. Richtig?

	// Dies machen wir so lange, bis wir am Ende von text
	// angelangt sind. Also das null terminierende Zeichen
	// erreichen.

	// Ich gebe dies nun explizit in der Bedingung an,
	// damit man es gut sieht. Gründsätzlich würde aber auch
	// ein *text reichen. '\0' entspricht dem Wert 0, was
	// als false interpretiert würde. Alles andere als 0
	// ist in C++ true.
	while('\0' != *text)
	{
		// Hexadezimalziffer?
		if('%' == *text)
		{
			// Ja, dann müssen wir übersetzen.

			// Zuerst gehen wir eine Stelle weiter.
			++text;

			// Hier ist nun die erste Hexadezimalziffer.
			// Wir übergeben es an deine Funktion und
			// speichern das Resultat in die aktuelle
			// Stelle von dest.
			*dest = hexToAscii(text);

			// text muss nun um eine weitere Stelle
			// nach vorne geschoben werden.
			// Die letzte Hexadezimalziffer, wird am
			// Ende der Schleife noch übersprungen.
			++text;
		}
		else
		{
			// Nein, also kopieren wir nur.
			*dest = *text;
		}

		// Die beiden Zeiger um eine Stelle weiterschieben.
		++text;
		++dest;
	}

	// Wir fügen noch eine terminierende 0 beim Puffer ein.
	*dest = '\0';

	// Fertig.
	// Gemerkt? Wir haben keine zusätzlichen Variablen benötigt.
	// Nicht mal Funktionen aus der C-Bibliothek. Oder nur indirekt.
}

char hexToAscii(const char* code)
{ 
	// Nur aus Sicherheit ein assert.
	assert(0 != code);

	// Nun, diese Funktion ändere ich ein wenig.
	// Am liebsten würde ich die C++ Konvertierung verwenden,
	// aber dann wird sicher wieder gemotzt, dass es OOP ist.
	// Dann verwende ich eben die C Möglichkeiten.

	// Dazu ist dein Code eigentlich schon ganz gut.
	// Allerdings ist das 0x zu begin optional, da über die
	// Basis 16 schon angegeben wird, dass Hexadezimalziffern
	// gemeint sind. Daher können wir das weglassen.
	// Auch ist der zweite Parameter von strtol optional.
	// Ein NULL reicht dort völlig. Steht übrigens alles
	// in der Referenz, welche du auch schon benutzt hast ;)

	// Wir benutzen zudem die sofortige Initialisierung.
	char hex[3] = { code[0], code[1], 0 };

	// Den Rückgabewert konvertieren wir explizit mit
	// dem C++ static_cast. Dies soll nur die Sache
	// verdeutlichen, also was hier eigentlich passiert.
	return static_cast&lt;char&gt;(strtol(hex, NULL, 16));
}

// Übrigens wird in C und teilweise C++ NULL nur für einen
// Nullzeiger verwendet. Man sollte also NULL nicht für 0
// oder '\0' verwenden. In C++ gibt es zudem auch noch die
// Möglichkeit ein nullptr Objekt zu bauen. Näher steht 
// in der FAQ. Aber da ihr ja nicht richtiges C++ macht,
// dürft ihr das sicher auch nicht verwenden. Kommt übrigens
// in den nächsten Standard sogar als Schlüsselwort rein.
</code></pre>
<p><strong>5.</strong> Ich hoffe ich habe keine groben Fehler gemacht.<br />
<strong>6.</strong> Zwei Links, zu Einträgen in der FAQ, welche ich erwähnt habe:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39480.html" rel="nofollow">FAQ - C++ - NULL oder 0 (eher veraltet)</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-220511.html" rel="nofollow">FAQ - C++ - nullptr (neu)</a><br />
<strong>7.</strong> Erwarte nicht, dass sowas zum Standard bei der Hilfestellung wird. Sonst dürftest du von diesem Forum enttäuscht werden. Ich glaube, ich habe gerade ein wenig übertrieben <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674652</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 05 Mar 2009 20:47:39 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Thu, 05 Mar 2009 14:39:28 GMT]]></title><description><![CDATA[<p>Daumen hoch für den Beitrag! Hoffentlich macht er was draus, erklären kannst du jedenfalls sehr gut <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/1674685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674685</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 05 Mar 2009 14:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Thu, 05 Mar 2009 20:53:40 GMT]]></title><description><![CDATA[<p>Noch eine kurze Bemerkung. Habe meinen Code noch korrigiert. Mir ist aufgefallen, dass ich vergessen habe, dass <code>strlen</code> die Länge des C-Strings ohne die Null-Terminierung zurückgibt. Wenn also nichts ersetzt hätte werden müssen, wäre es zu einem Überlauf mit undefiniertem Verhalten gekommen, da die Null-Terminierung des Puffers in Speicher geschrieben worden wäre, welcher nicht reserviert wurde. Deshalb hat es nun ein +1 drin und deshalb wurde mein Post editiert.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a>,<br />
Ehm, danke.<br />
*froh ist dem Galgen entkommen zu sein* <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1674911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1674911</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 05 Mar 2009 20:53:40 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 06 Mar 2009 01:22:17 GMT]]></title><description><![CDATA[<p>Du bist super!</p>
<p>Nun hast du den Code zwar für mich geschrieben, aber ich denke mit deinen sehr ausführlichen Kommentaren kann ich mich hervorragend durch das Programm denken und jeden einzelnen Schritt nachverfolgen, was ich jetzt auch mal tun werde. Danach geb ich nochmal Feedback ab <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="🙂"
    /> Vorab auf jeden Fall erstmal vielen Dank für deine wirklich großartige Hilfsbereitschaft und mit meinem Lehrer werde ich mal einige Worte wechseln. So oder so möchte ich mich deiner Tipps annehmen und mich selbst schlau machen über richtiges C++, und auch werde ich meinen Lehrer bitten dies zu akzeptieren. <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>
<p>Mit meinem Feedback kannst du entweder morgen schon oder spätestens Samstag rechnen! Noch 3x Danke für deine Bemühungen!</p>
<p>Mit freundlichen Grüßen,<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675001</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Fri, 06 Mar 2009 01:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 06 Mar 2009 12:23:20 GMT]]></title><description><![CDATA[<p>So, wie versprochen hier mein Feedback.</p>
<p>Ich habe mir das Programm jetzt lange und oft angeschaut und mir quasi ein &quot;Struktogramm&quot; dazu gemacht. Durch Hilfe dessen und deine Erklärungen bin ich jetzt mit dem Quellcode vertraut, bzw. mit dem was er macht. Mir gefällt deine Strukturierung sehr gut und dein Code ist auf Grund der sinnvollen Kommentare und Einrückungen leicht nachvollziehbar. Allerdings habe ich noch 2-3 Fragen an dich.</p>
<p>1. Warum benutzt du bei Kontrollstrukturen/Abfragen diese Variante: <code>'\0' != *text</code> und nicht <code>*text != '\0'</code> ? Hat das einen bestimmten Grund, bringt es einen Vorteil oder ändert es irgendetwas an der Geschwindigkeit?</p>
<p>2. Wo läge der Unterschied, wenn ich statt <code>++text;</code> einfach <code>text++;</code> benutzen würde?</p>
<p>3. Ist die <code>+ 1</code> in dieser Deklaration: <code>char* buffer = new char[strlen(text) + 1];</code> für den Nullterminator gedacht?</p>
<p>4. Angenommen, ich lasse <code>void changeText(char* dest, char const* text)</code> rekursiv laufen. Welche Auswirkungen hätte das auf die Geschwindigkeit?</p>
<p>Danke und mit freundl. Grüßen<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675199</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Fri, 06 Mar 2009 12:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 06 Mar 2009 12:43:41 GMT]]></title><description><![CDATA[<p>root2k schrieb:</p>
<blockquote>
<p>1. Warum benutzt du bei Kontrollstrukturen/Abfragen diese Variante: <code>'\0' != *text</code> und nicht <code>*text != '\0'</code> ? Hat das einen bestimmten Grund, bringt es einen Vorteil oder ändert es irgendetwas an der Geschwindigkeit?</p>
</blockquote>
<p>Das machen Leute die ihren Compilern nicht trauen.<br />
Weil wenn du das ! vergisst, dann kompiliert<br />
'\0'=*text<br />
nicht und bei<br />
*text='\0'<br />
wird nur eine warnung ausgegeben.</p>
<blockquote>
<p>2. Wo läge der Unterschied, wenn ich statt <code>++text;</code> einfach <code>text++;</code> benutzen würde?</p>
</blockquote>
<p>++text ist increment and fetch<br />
text++ ist fetch and increment</p>
<p>sprich:<br />
++text liefert text+1<br />
text++ liefert text</p>
<p>nach dem statement wurde text in beiden faellen um 1 erhoeht.<br />
++text ist natuerlich besser als text++ da nicht erst eine kopie erstellt werden muss.</p>
<blockquote>
<p>3. Ist die <code>+ 1</code> in dieser Deklaration: <code>char* buffer = new char[strlen(text) + 1];</code> für den Nullterminator gedacht?</p>
</blockquote>
<p>ja.</p>
<blockquote>
<p>4. Angenommen, ich lasse <code>void changeText(char* dest, char const* text)</code> rekursiv laufen. Welche Auswirkungen hätte das auf die Geschwindigkeit?</p>
</blockquote>
<p>kommt auf die konkrete implementierung von changeText an (in diesem thread gibt es mehrere). generell sehe ich aber keinen vorteil in einer rekursion hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675216</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 06 Mar 2009 12:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 06 Mar 2009 13:23:55 GMT]]></title><description><![CDATA[<p>Ein paar Ergänzungen zu Shade Of Mines Aussagen:<br />
1. Bei <code>*text = '\0'</code> wird keine Warnung ausgegeben, jedenfalls bei meinem Kompiler nicht. Es gibt schliesslich auch keinen Grund, dies könnte durchaus gewollt sein.<br />
Also geht es nicht darum, dass ich meinem Kompiler nicht vertraue, sondern ich vertraue mir nicht <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>
<p>2. Man kann das vielleicht auch noch mit Pseudo Code ein wenig verdeutlichen:</p>
<pre><code>operator ++ Prefix (also davor)
{
  Inkrementiere Objekt.
  Gib das Objekt zurück.
}

operator ++ Postfix (also danach)
{
  Erzeuge Kopie des Objekts.
  Inkrementiere Objekt.
  Gib die Kopie zurück.
}
</code></pre>
<p>Es macht zwar bei einem Zeiger nicht viel aus und in diesem speziellen Fall würde der Kompiler wohl sogar erkennen, dass die Kopie nicht benötigt wird, wodurch er sie weglässt. Es ist daher mehr eine Angewohnheit und erst bei einem komplexeren, bzw. grösseren, Datentyp kann ein Unterschied auftauchen. Es ist daher auch ein wenig eine Frage nach der Funktionalität. Brauchst du diese Kopie des alten Objektes? Nein? Dann nimm den Prefix Operator.</p>
<p>3. Gibt es nichts hinzuzufügen. Habe ich wie gesagt, erst später gemerkt, dass dieses +1 noch hin muss.</p>
<p>4. Eine Sache zur Rekursion:<br />
Eine Rekursion birgt immer die Gefahr eines Stackoverflows. Jeglicher Funktionsaufruf verbraucht Stackspeicher und je nach dem in der Funktion selbst braucht es nochmals. Bei jeder Rekursion wird somit immer wie mehr Stackspeicher benötig. Der Stackspeicher ist aber relativ klein, wodurch bei unbedachtem Vorgehen ein Stackoverflow entsteht, also es hat keinen Stackspeicher mehr -&gt; Programmabsturz.<br />
Deshalb bin ich persönlich nicht wirklich ein Fan von der Rekursion und setze sie nur mit äusserster Vorsicht ein. Schliesslich ist jede Rekursion auch durch eine Iteration realisierbar.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675253</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 06 Mar 2009 13:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to WEBCGI-Projekt | Verbesserungsvorschläge on Fri, 06 Mar 2009 14:06:57 GMT]]></title><description><![CDATA[<p>Hallo Dravere,</p>
<p>gäbe es denn deinerseits eine beispielhafte Situation für den sinngemäßen Einsatz einer Rekursion? Das war einer der längsten Themen, die wir im Fach Programmieren durch genommen haben und scheint mir von hoher Priorität. Oder der Lehrer hat wieder mal nur Quatsch verzällt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Mit freundl. Grüßen<br />
Kevin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1675296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1675296</guid><dc:creator><![CDATA[root2k]]></dc:creator><pubDate>Fri, 06 Mar 2009 14:06:57 GMT</pubDate></item></channel></rss>