<?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[Methode zum Parsen von Strings gesucht]]></title><description><![CDATA[<p>Ich suche eine Bibliothek, die das Parsen von simplen Strings einfacher macht.<br />
Also z.B. eine Art scanf, mit dem man folgendes machen kann:</p>
<pre><code>std::string a;
int b;
double c;
std::atomic_int d;

std::string line=&quot;abcdef delim var=1, 2, 3 delim&quot;;
if (sscanf(line,&quot;%*delim %s=%d, %u, %d delim&quot;,a,b,c,d)==4)...;
</code></pre>
<p>k.A. ob es überhaupt möglich ist, zur Laufzeit die richtigen Konversionen und Zuweisungen auszuführen, aber Templatemagier sind bekanntlich erfinderisch.<br />
Muss natürlich nicht genau solch ein scanf sein, alternativen Ansätze sind willkommen, solange sie nur einfach zu benutzen sind.</p>
<p>Wie macht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322125/methode-zum-parsen-von-strings-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 10:09:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322125.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Dec 2013 19:10:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sat, 07 Dec 2013 19:10:09 GMT]]></title><description><![CDATA[<p>Ich suche eine Bibliothek, die das Parsen von simplen Strings einfacher macht.<br />
Also z.B. eine Art scanf, mit dem man folgendes machen kann:</p>
<pre><code>std::string a;
int b;
double c;
std::atomic_int d;

std::string line=&quot;abcdef delim var=1, 2, 3 delim&quot;;
if (sscanf(line,&quot;%*delim %s=%d, %u, %d delim&quot;,a,b,c,d)==4)...;
</code></pre>
<p>k.A. ob es überhaupt möglich ist, zur Laufzeit die richtigen Konversionen und Zuweisungen auszuführen, aber Templatemagier sind bekanntlich erfinderisch.<br />
Muss natürlich nicht genau solch ein scanf sein, alternativen Ansätze sind willkommen, solange sie nur einfach zu benutzen sind.</p>
<p>Wie macht ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370457</guid><dc:creator><![CDATA[scanf war praktisch]]></dc:creator><pubDate>Sat, 07 Dec 2013 19:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sat, 07 Dec 2013 19:12:14 GMT]]></title><description><![CDATA[<p>scanf war praktisch schrieb:</p>
<blockquote>
<p>Wie macht ihr das?</p>
</blockquote>
<p>std::regex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370459</guid><dc:creator><![CDATA[regex++]]></dc:creator><pubDate>Sat, 07 Dec 2013 19:12:14 GMT</pubDate></item><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sat, 07 Dec 2013 19:25:11 GMT]]></title><description><![CDATA[<p>von regex wollte ich mich fern halten, da das meist unleserlichen Code erzeugt. Wenn ich 10 Minuten brauche, um eine besonders clevere Zeile regex zu verstehen, dann möchte ich jemanden hauen, am besten den verantwortlichen Autor.</p>
<p>Dennoch, ich probiere mal, ob das für den aktuellen Anwendungsfall ausreichend gut funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370460</guid><dc:creator><![CDATA[scanf war praktisch]]></dc:creator><pubDate>Sat, 07 Dec 2013 19:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sat, 07 Dec 2013 19:59:32 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_55_0/libs/format/" rel="nofollow">Boost.Format</a>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370465</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 07 Dec 2013 19:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sat, 07 Dec 2013 20:04:12 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_55_0/libs/format/" rel="nofollow">Boost.Format</a>?</p>
</blockquote>
<p>Ist dir der Unterschied von scanf und printf bekannt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370467</guid><dc:creator><![CDATA[lieber sone]]></dc:creator><pubDate>Sat, 07 Dec 2013 20:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Methode zum Parsen von Strings gesucht on Sun, 08 Dec 2013 01:43:48 GMT]]></title><description><![CDATA[<p>lieber sone schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_55_0/libs/format/" rel="nofollow">Boost.Format</a>?</p>
</blockquote>
<p>Ist dir der Unterschied von scanf und printf bekannt?</p>
</blockquote>
<p>Tut mir Leid, mein Fehler - ich meinte mich erinnern zu können, dass Boost.Format auch parst. Aber das ist offensichtlich nicht der Fall.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;limits&gt;

std::istream&amp; gen_scanf( std::istream&amp; is,
                         char const* format )
{
	while( *format )
		if( is.get() != *format++ )
		{
			is.setstate( std::ios_base::failbit );
			break;
		}

	return is;
}

template&lt; typename Input &gt;
void extract( std::istream&amp; is, char const*, Input&amp; input )
{
	is &gt;&gt; input;
}

void extract( std::istream&amp; is, char const*&amp; format, std::string&amp; input )
{
	std::getline(is, input, *format++);
}

template&lt; typename First, typename... Tail&gt;
std::istream&amp; gen_scanf( std::istream&amp; is,
                         char const* format,
                         First&amp; first, Tail&amp;... tail )
{
	while( *format &amp;&amp; is )
	{
		if( *format == '%' )
			if( *++format == '*' )
			{
				++format;
				while( is &amp;&amp; is.get() != *format );
				++format;
			}
			else
			{
				extract(is, format, first);
				return gen_scanf(is, format, tail...);
			}
		else if( *format++ != is.get() )
		{
			is.setstate( std::ios_base::failbit );
			break;
		}
	}

	return is;
}

template&lt; typename First, typename... Tail&gt;
std::istream&amp; gen_sscanf( char const* input,
                          char const* format,
                          First&amp; first, Tail&amp;... tail )
{
	std::istringstream stream{input};
	return gen_scanf(stream, format, first, tail...);
}

int main ()
{
	std::string a;
	int b;
	double c;

	std::string line=&quot;abcdef delim var=1, 2 delim&quot;;
	gen_sscanf(line.c_str(),&quot;%* delim %=%, % delim&quot;,a,b,c);

	std::cout &lt;&lt; &quot;a: &quot; &lt;&lt; a &lt;&lt; '\n'
	          &lt;&lt; &quot;b: &quot; &lt;&lt; b &lt;&lt; '\n'
	          &lt;&lt; &quot;c: &quot; &lt;&lt; c &lt;&lt; '\n';
}
</code></pre>
<p>Das ist eine minimalistische Implementierung, die obigem entspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370477</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 08 Dec 2013 01:43:48 GMT</pubDate></item></channel></rss>