<?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[Probleme mit Strings undVariablen langen Argumentlisten]]></title><description><![CDATA[<p>Hallo,<br />
hier ein kleiner Auszug aus meinem Programm</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string.h&gt;

char toStringBuf[202];
char * toString(const char *format, ...)
{
	if(toStringBuf == NULL)
		exit(666);

	va_list argzeiger;
	va_start(argzeiger,format);
	vsnprintf(toStringBuf, 200, format, argzeiger);
	va_end(argzeiger);
	return toStringBuf;
}
void PrintX(const char *x)
{
	if(strcmp(x, &quot;KLNF&quot;) == 0)
		printf(&quot;Die sind gleich\n&quot;);

	printf(&quot;Mit X:\n&quot;);

		printf(toString(&quot;bla\n%s\n&quot;, x));

	printf(&quot;Mit KLNF:\n&quot;);

		printf(toString(&quot;bla\n%s\n&quot;, &quot;KLNF&quot;));
}

int main()
{
	PrintX(toString(&quot;KLNF&quot;));
	return 0;
}
</code></pre>
<p>Die toString funktion habe ich programmiert um z.B.</p>
<pre><code>int var = 123;
toString(&quot;var = %i&quot;, var)
</code></pre>
<p>in &quot;var = 123&quot; umzuwandeln.<br />
Erst wird &quot;KLNF&quot; mittels toString in &quot;KLNF&quot; umgewandelt und PrintX übergeben. Das das toString(&quot;KLNF&quot;) auch wirklich &quot;KLNF&quot; ist zeigt das strcmp.<br />
Aber!: wenn man printf(toString(&quot;bla\n%s\n&quot;, x)); macht steht da</p>
<pre><code>bla
bla
</code></pre>
<p>statt(wie bei printf(toString(&quot;bla\n%s\n&quot;, &quot;KLNF&quot;));)</p>
<pre><code>bla
KLNF
</code></pre>
<p>Komplette Ausgabe:</p>
<pre><code>Die sind gleich
Mit X:
bla
bla

Mit KLNF:
bla
KLNF
</code></pre>
<p>Ich vermute stark dass der Fehler in toString() liegt.<br />
Ich hoffe ihr könnt mir helfen.</p>
<p>PS: Ich weiß ich könnte einfach printf(&quot;bla\nKLNF&quot;); machen, aber bei meinem Programm wird die funktion toString manchmal benutzt und des ist irgendwie buggy.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/331190/probleme-mit-strings-undvariablen-langen-argumentlisten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 21:01:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/331190.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Feb 2015 16:44:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 16:44:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
hier ein kleiner Auszug aus meinem Programm</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string.h&gt;

char toStringBuf[202];
char * toString(const char *format, ...)
{
	if(toStringBuf == NULL)
		exit(666);

	va_list argzeiger;
	va_start(argzeiger,format);
	vsnprintf(toStringBuf, 200, format, argzeiger);
	va_end(argzeiger);
	return toStringBuf;
}
void PrintX(const char *x)
{
	if(strcmp(x, &quot;KLNF&quot;) == 0)
		printf(&quot;Die sind gleich\n&quot;);

	printf(&quot;Mit X:\n&quot;);

		printf(toString(&quot;bla\n%s\n&quot;, x));

	printf(&quot;Mit KLNF:\n&quot;);

		printf(toString(&quot;bla\n%s\n&quot;, &quot;KLNF&quot;));
}

int main()
{
	PrintX(toString(&quot;KLNF&quot;));
	return 0;
}
</code></pre>
<p>Die toString funktion habe ich programmiert um z.B.</p>
<pre><code>int var = 123;
toString(&quot;var = %i&quot;, var)
</code></pre>
<p>in &quot;var = 123&quot; umzuwandeln.<br />
Erst wird &quot;KLNF&quot; mittels toString in &quot;KLNF&quot; umgewandelt und PrintX übergeben. Das das toString(&quot;KLNF&quot;) auch wirklich &quot;KLNF&quot; ist zeigt das strcmp.<br />
Aber!: wenn man printf(toString(&quot;bla\n%s\n&quot;, x)); macht steht da</p>
<pre><code>bla
bla
</code></pre>
<p>statt(wie bei printf(toString(&quot;bla\n%s\n&quot;, &quot;KLNF&quot;));)</p>
<pre><code>bla
KLNF
</code></pre>
<p>Komplette Ausgabe:</p>
<pre><code>Die sind gleich
Mit X:
bla
bla

Mit KLNF:
bla
KLNF
</code></pre>
<p>Ich vermute stark dass der Fehler in toString() liegt.<br />
Ich hoffe ihr könnt mir helfen.</p>
<p>PS: Ich weiß ich könnte einfach printf(&quot;bla\nKLNF&quot;); machen, aber bei meinem Programm wird die funktion toString manchmal benutzt und des ist irgendwie buggy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442831</guid><dc:creator><![CDATA[C++kryptomatrix]]></dc:creator><pubDate>Sun, 15 Feb 2015 16:44:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 17:10:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Dein toStringBuf ist eine globale Variable. Damit handelt man sich solche Fehler ein. Dein const char *x in PrintX kommt ja schon aus toString und ist ja nichts anders als ein Zeiger auf toStringBuf. Beim nächsten Aufruf von toString überschreibst Du das zuerst mit &quot;bla\n%s\n&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442842</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Sun, 15 Feb 2015 17:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 18:08:40 GMT]]></title><description><![CDATA[<p>C++kryptomatrix schrieb:</p>
<blockquote>
<pre><code>char toStringBuf[202];

	if(toStringBuf == NULL)
		exit(666);
</code></pre>
</blockquote>
<p>Was soll das bei einem Array?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442859</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 15 Feb 2015 18:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 18:57:32 GMT]]></title><description><![CDATA[<p>DJohn schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Dein toStringBuf ist eine globale Variable. Damit handelt man sich solche Fehler ein. Dein const char *x in PrintX kommt ja schon aus toString und ist ja nichts anders als ein Zeiger auf toStringBuf. Beim nächsten Aufruf von toString überschreibst Du das zuerst mit &quot;bla\n%s\n&quot;.</p>
</blockquote>
<p>Macht Sinn, danke.</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string&gt;

const char* toString(const char *format, ...)
{
	va_list argzeiger;
	va_start(argzeiger,format);
	char toStringBuf[201];
	if(vsnprintf(toStringBuf,  201, format, argzeiger) &gt;= 200)
		perror(&quot;too long&quot;);
	va_end(argzeiger);
	std::string returning(toStringBuf);
	return returning.c_str();
}
void PrintX(const char *x)
{
	printf(toString(&quot;bla\n%s\n&quot;, x));
}

int main()
{
	PrintX(toString(&quot;KLNF&quot;));
	return 0;
}
</code></pre>
<p>Ist das jetzt so richtig? Es funktioniert, aber ich bin mir nicht sicher ob das Objekt returning gelöscht wird, wenn die Funktion zu Ende ist und dann der zeiger nur noch &quot;zufällig&quot; auf &quot;bla KLNF&quot; zeigt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442862</guid><dc:creator><![CDATA[C++kryptomatrix]]></dc:creator><pubDate>Sun, 15 Feb 2015 18:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 19:05:44 GMT]]></title><description><![CDATA[<p>C++kryptomatrix schrieb:</p>
<blockquote>
<p>aber ich bin mir nicht sicher ob das Objekt returning gelöscht wird, wenn die Funktion zu Ende ist und dann der zeiger nur noch &quot;zufällig&quot; auf &quot;bla KLNF&quot; zeigt?</p>
</blockquote>
<p>Genau das passiert =&gt; das Programm ist falsch. Wenn du das als DEBUG Build laufen lässt sollte der Fehler auch sofort &quot;sichtbar&quot; werden.</p>
<p>Deine <code>toString</code> Funktion müsste z.B. einen <code>std::string</code> zurückgeben damit das funktionieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442863</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Feb 2015 19:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 19:19:12 GMT]]></title><description><![CDATA[<p>Ja, jetzt hast Du eine lokale Variable, die ungültig wird, sobald Du den Scope verläßt. Auch der Zeiger, den Du mit c_str() holst, ist nach dem return ungültig. Dass es in Deinem Test funktioniert, ist nur Zufall.<br />
Eine einfache Lösung, das zu reparieren, hab ich nicht. Ich würde ja std:string als Rückgabewert von toString empfehlen. Der wird dann automatisch kopiert. Allerdings kann man std::string nicht als Parameter in der Ellipse ... nutzen. Falls das also jemand macht, ist Dein Code immer noch kaputt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442864</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Sun, 15 Feb 2015 19:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 19:34:30 GMT]]></title><description><![CDATA[<p>ps: Sieh dir mal <code>boost::format</code> an.<br />
<code>boost::format</code> löst u.A. das von DJohn angesprochene Problem mit der Verwendung von <code>std::string</code> als vararg Parameter -- indem einfach keine vararg Parameter verwendet werden <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>Was überhaupt viele Vorteile hat. Dadurch kann <code>boost::format</code> z.B. auch erkennen wenn zu viele oder (schlimmer) zu wenige Parameter übergeben wurden.<br />
Und es entfällt die Notwendigkeit den genauen Typ im Platzhalter anzugeben. Man kann z.B. einfach &quot;bla\n%1%\n&quot; schreiben - wobei %1% dann mit der Textdarstellung des 1. &quot;Replacement-Wertes&quot; ersetzt wird. Egal ob es ein String oder eine Zahl oder sonstwas ist.</p>
<p><a href="http://www.boost.org/doc/libs/1_57_0/libs/format/doc/format.html" rel="nofollow">http://www.boost.org/doc/libs/1_57_0/libs/format/doc/format.html</a><br />
<a href="http://www.boost.org/doc/libs/1_57_0/libs/format/doc/format.html#examples" rel="nofollow">http://www.boost.org/doc/libs/1_57_0/libs/format/doc/format.html#examples</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442867</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Feb 2015 19:34:30 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 20:45:45 GMT]]></title><description><![CDATA[<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string&gt;

std::string toString(const char *format, ...)
{
    va_list argzeiger;
    va_start(argzeiger,format);
    char toStringBuf[201];
    if(vsnprintf(toStringBuf,  201, format, argzeiger) &gt;= 200)
        perror(&quot;too long&quot;);
    va_end(argzeiger);
    std::string returning(toStringBuf);
    return returning;
}
void PrintX(const char *x)
{
   printf(toString(&quot;bla\n%s\n&quot;, x).data());
}

int main()
{
    PrintX(toString(&quot;KLNF&quot;).data());
    return 0;
}
</code></pre>
<p>So müsste es dann funktionieren.<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442878</guid><dc:creator><![CDATA[C++ kryptomatrix]]></dc:creator><pubDate>Sun, 15 Feb 2015 20:45:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 21:06:07 GMT]]></title><description><![CDATA[<p>Schau dir noch mal hustbärs Vorschlag an...</p>
<p>Und meines Wissens hängt string::data() keine 0 an, bzw. sie muss es nicht, die Funktion ist daher in vielen Fällen eher nutzlos, manchmal (wie bei dir) gefährlich.<br />
c_str() fügt die Nullterminierung an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442880</guid><dc:creator><![CDATA[dwarf]]></dc:creator><pubDate>Sun, 15 Feb 2015 21:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Sun, 15 Feb 2015 22:39:11 GMT]]></title><description><![CDATA[<p>dwarf schrieb:</p>
<blockquote>
<p>Und meines Wissens hängt string::data() keine 0 an, bzw. sie muss es nicht</p>
</blockquote>
<p>Ab C++11 muss ein 0 Char angehängt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442884</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 15 Feb 2015 22:39:11 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Mon, 16 Feb 2015 12:03:22 GMT]]></title><description><![CDATA[<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;string&gt;

#define cptr c_str() 
std::string toString(const char *format, ...)
{
    va_list argzeiger;
    va_start(argzeiger,format);
    char toStringBuf[201];
    if(vsnprintf(toStringBuf,  201, format, argzeiger) &gt;= 200)
        perror(&quot;too long&quot;);
    va_end(argzeiger);
    std::string returning(toStringBuf);
    return returning;
}
void PrintX(const char *x)
{
   printf(toString(&quot;bla\n%s\n&quot;, x).cptr);
}

int main()
{
    PrintX(toString(&quot;KLNF&quot;).cptr);
    return 0;
}
</code></pre>
<p>So müsste des dann funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442949</guid><dc:creator><![CDATA[C++kryptomatrix]]></dc:creator><pubDate>Mon, 16 Feb 2015 12:03:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Mon, 16 Feb 2015 12:38:13 GMT]]></title><description><![CDATA[<p>Und wenn wir schon C++ programmieren binden wir auch die richtigen Header ein:</p>
<pre><code>#include &lt;cstdio&gt;
#include &lt;cstdlib&gt;
#include &lt;cstdarg&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2442953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442953</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 16 Feb 2015 12:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Strings undVariablen langen Argumentlisten on Mon, 16 Feb 2015 17:18:05 GMT]]></title><description><![CDATA[<p>C++kryptomatrix schrieb:</p>
<blockquote>
<pre><code>#define cptr c_str()
</code></pre>
</blockquote>
<p>Lass sowas bleiben.<br />
&quot;Trying to be cute&quot; hat nix mit ernsthafter Softwareentwicklung zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2442999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2442999</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Feb 2015 17:18:05 GMT</pubDate></item></channel></rss>