<?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[Eure Meinug zum Code]]></title><description><![CDATA[<p>Hallo, ich habe schon etwas über C/C++ gelernt. Nun, um das ganze zu festigen wollte ich meine eigene String-Klasse programmieren.</p>
<p>Würdet ihr auch das ansehen und eure Meingung sagen? Vor allem den Copyconstruktor funktioniert glaube ich nicht ganz richtig. Weil bei ein paar Tests das Programm immer wieder abgestürzt ist. Mit echt seltsamen Fehlermeldungen.</p>
<pre><code class="language-cpp">#ifndef _parsx_h_
#define _parsx_h_

int convert(char c);

namespace prsx
{
	int len(const char* st);
	int convert(char *c);

	class string{
	private:

		//
		// Member
		//
		///////////////////////////////////////////////////////////
		char* m_string;
		int   m_counter;

		//
		// private Methoden
		//
		///////////////////////////////////////////////////////////
		void cpychar(const char*);

	public:

		//
		// Konstruktor/en
		//
		///////////////////////////////////////////////////////////
		string ();
		string (const char*);
		string (const string&amp;);

		//
		// Destruktor
		//
		///////////////////////////////////////////////////////////
		~string();

		// 
		// public Methoden
		//
		///////////////////////////////////////////////////////////
		string lower(void);
		string left(int);
		string right(int);
		string mid(int, int);
		void trim(void);
		int len(void);
		int instr(const char*,int);
		int instr(const string,int);
		char* _char(void);	

		// 
		// Überladene Operatoren
		//
		///////////////////////////////////////////////////////////
		char* operator+(const char*);
		char* operator+(string);
		string&amp; operator=(const char*);
		string&amp; operator=(const string&amp;);
		bool operator==(const string);
		bool operator==(const char*);
		bool operator!=(const string);
		bool operator!=(const char*);	
	};
};//namespace

#endif
</code></pre>
<pre><code class="language-cpp">#include&quot;parsx.h&quot;

namespace prsx
{
        // char in int
	int convert(char *c) 
	{ 
		int counter=prsx::len(c);
		int result=0;
		int summ  =0;
		int pot   =1;

		while(counter&gt;0)
		{
			counter--;
			summ = ((prsx::len(c))-1 - counter);

			for(int i=0; i&lt;summ; i++)
				pot=pot*10;

			summ = pot * (((c[counter] &gt;= '0' &amp;&amp; c[counter] &lt;= '9') ? c[counter]-'0' : -1));

			result = result + summ;
			pot=1;
		}
		return result; 
	} 

	int len(const char* st)
	{
		int counter=0;
		while (st[counter])
		{
			counter++;
		}
		return counter;
	}

	//
	//	Konstruktor / Copykonstruktor
	//
	///////////////////////////////////////////////////////////
	string::string()
	{
		m_string=0L;
	}

	string::string(const char* string)
	{	
		m_string=0L;
		cpychar(string);
	}

	string::string(const string&amp; prx)
	{
		m_string=0L;
		cpychar(prx.m_string);
	}

	//
	//	Destruktor
	//
	///////////////////////////////////////////////////////////
	string::~string()
	{
		if(m_string)
			delete[] m_string;
	}

	//
	//	Überladene Operatoren
	//
	///////////////////////////////////////////////////////////
	char*
	string::operator+(const char* t)
	{
		char* temp_char=new char[this-&gt;len()+prsx::len(t)];

		int counter=0;

		while(counter&lt;=this-&gt;len())
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		}

		counter--;
		while(counter&lt;=this-&gt;len()+prsx::len(t))
		{ 
			temp_char[counter]=t[counter-this-&gt;len()]; 
			counter++;
		}

		temp_char[counter]='\0';

		return temp_char;
	}

	char*
	string::operator+(string str)
	{
		char* t = str._char();

		char* temp_char=new char[this-&gt;len()+prsx::len(t)];

		int counter=0;

		while(counter&lt;=this-&gt;len())
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		}

		counter--;
		while(counter&lt;=this-&gt;len()+prsx::len(t))
		{ 
			temp_char[counter]=t[counter-this-&gt;len()]; 
			counter++;
		}

		temp_char[counter]='\0';

		return temp_char;
	}

	string&amp; 
	string::operator=(const char* t)
	{	
		cpychar(t);
		return *this;
	}

	string&amp; 
	string::operator=(const string&amp; prx)
	{
		if(this==&amp;prx)
			return *this;

		cpychar(prx.m_string);
		return *this;
	}

	bool 
	string::operator==(string prx)
	{
		if(this==&amp;prx)
			return true;
		if (len()!=prx.len())
			return false; 
		if(instr(prx._char(),0)==0)return false; 
			return true;
	}

	bool 
	string::operator==(const char* t)
	{
		if(this-&gt;len()!=prsx::len(t))
			return false;
		if(instr(t,0)==0)
			return false; 
		return true;
	}

	bool 
	string::operator!=(string prx)
	{
		if (len()!=prx.len())
			return true; 
		if(instr(prx._char(),0)==0)return true; 
			return false;
	}

	bool 
	string::operator!=(const char* t)
	{
		if (len()!=prsx::len(t))
			return true; 
		if(instr(t,0)==0)
			return true; 
		return false;
	}

	//
	//	private Methoden
	///////////////////////////////////////////////////////////

	//
	//	Kopiert str in m_string
	//
	void
	string::cpychar(const char* str)
	{
		delete[] m_string;

		m_string  = new char[prsx::len(str)+1];
		m_counter = 0;

		while(str[m_counter]!='\0')
		{
			m_string[m_counter]=str[m_counter];
			m_counter++;
		}

		m_string[m_counter]='\0';
	}

	//
	//	public Methoden
	//
	///////////////////////////////////////////////////////////

	//
	//	Länge von m_string
	//
	int 
	string::len()
	{
		int counter=0;
		while(m_string[counter])
		{
			counter++;
		}
		return counter;
	}

	//
	//	a Zeilen von links
	//
	string
	string::left(int a)
	{
		char* temp_char = new char[a+1];
		int counter=0;
		a--;
		while(counter&lt;=a)
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		} 
		temp_char[counter]='\0';
		string st=temp_char;

		delete[] temp_char;
		return st;
	}

	//
	//	a Zeilen von rechts
	//
	string
	string::right(int a)
	{
		int counter=0; 
		int l=this-&gt;len()-a;
		char* temp_char= new char[a+1];
		while(m_string[l+counter])
		{
			temp_char[counter]=m_string[l+counter];
			counter++;
		}
		temp_char[counter]='\0';
		string temp_parsx=temp_char;

		delete[] temp_char;
		return temp_parsx;
	}

	//
	//	a Zeilen ab b
	//
	string
	string::mid(int a, int b)
	{
		int counter=0;
		char* temp_char=new char[a+1];
		a--;
		while(counter&lt;=a)
		{
			temp_char[counter]=m_string[counter+b-1];
			counter++;
		}
		temp_char[counter]='\0';
		string temp_parsx=temp_char;

		delete[] temp_char;
		return temp_parsx;
	}

	//
	//	ist t ab a in parsx?
	//
	int 
	string::instr(const char* t, int a)
	{
		int	l = prsx::len(t);
		int counter = 0;

		if(a&lt;0)
			return 0;

		while(m_string[a])
		{
			while(t[counter])
			{
				if(t[counter]!=m_string[a+counter]) break;
				counter++;
				if(counter==l) return a+1;
			}
			counter=0;
			a++;
		}
		return 0;
	}

	//
	//	ist parsx ab a in parsx
	//
	int 
	string::instr(string st, int a)
	{
		char* temp_char=st._char();
		int	l = prsx::len(temp_char); 
		int counter = 0;

		if(a&lt;0) 
			return 0;

		while(m_string[a])
		{
			while(temp_char[counter])
			{
				if(temp_char[counter]!=m_string[a+counter]) 
					break;
				counter++;
				if(counter==l) return a+1;
			}
			counter=0;
			a++;
		}
	return 0;
	}

	//
	//	in Kleinbuchstaben umwandeln
	//
	string
	string::lower(void)
	{
		int counter=0;

		while(m_string[counter])
		{
			if(m_string[counter]&gt;64 &amp;&amp; m_string[counter]&lt;91)
				m_string[counter]=m_string[counter]+32;
			else
				m_string[counter]=m_string[counter];
			counter++;
		}

		return m_string;
	}

	//
	// Leerzeielen links und rechts löschen
	//
	void
	string::trim(void)
	{
		int front=0;
		while(m_string[front] &amp;&amp; m_string[front]==' ')
		{
			front++;
		}

		int back=len()-1;
		while(m_string[back] &amp;&amp; m_string[back]==' ')
		{
			back--;
		}
		back=len()-back;

		int a=len()-(front+back);

		char* temp = new char[a+1];

		int counter=0;
		while(counter&lt;=a)
		{ 
			temp[counter]=m_string[counter+front]; 
			counter++;
		} 

		temp[counter]='\0';

		cpychar(temp);
	}

	//
	//	char* zurückgeben
	//
	char*
	string::_char(void)
	{
		return m_string;
	}
};//namespace
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/168236/eure-meinug-zum-code</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:37:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168236.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Dec 2006 21:03:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eure Meinug zum Code on Tue, 19 Dec 2006 21:03:51 GMT]]></title><description><![CDATA[<p>Hallo, ich habe schon etwas über C/C++ gelernt. Nun, um das ganze zu festigen wollte ich meine eigene String-Klasse programmieren.</p>
<p>Würdet ihr auch das ansehen und eure Meingung sagen? Vor allem den Copyconstruktor funktioniert glaube ich nicht ganz richtig. Weil bei ein paar Tests das Programm immer wieder abgestürzt ist. Mit echt seltsamen Fehlermeldungen.</p>
<pre><code class="language-cpp">#ifndef _parsx_h_
#define _parsx_h_

int convert(char c);

namespace prsx
{
	int len(const char* st);
	int convert(char *c);

	class string{
	private:

		//
		// Member
		//
		///////////////////////////////////////////////////////////
		char* m_string;
		int   m_counter;

		//
		// private Methoden
		//
		///////////////////////////////////////////////////////////
		void cpychar(const char*);

	public:

		//
		// Konstruktor/en
		//
		///////////////////////////////////////////////////////////
		string ();
		string (const char*);
		string (const string&amp;);

		//
		// Destruktor
		//
		///////////////////////////////////////////////////////////
		~string();

		// 
		// public Methoden
		//
		///////////////////////////////////////////////////////////
		string lower(void);
		string left(int);
		string right(int);
		string mid(int, int);
		void trim(void);
		int len(void);
		int instr(const char*,int);
		int instr(const string,int);
		char* _char(void);	

		// 
		// Überladene Operatoren
		//
		///////////////////////////////////////////////////////////
		char* operator+(const char*);
		char* operator+(string);
		string&amp; operator=(const char*);
		string&amp; operator=(const string&amp;);
		bool operator==(const string);
		bool operator==(const char*);
		bool operator!=(const string);
		bool operator!=(const char*);	
	};
};//namespace

#endif
</code></pre>
<pre><code class="language-cpp">#include&quot;parsx.h&quot;

namespace prsx
{
        // char in int
	int convert(char *c) 
	{ 
		int counter=prsx::len(c);
		int result=0;
		int summ  =0;
		int pot   =1;

		while(counter&gt;0)
		{
			counter--;
			summ = ((prsx::len(c))-1 - counter);

			for(int i=0; i&lt;summ; i++)
				pot=pot*10;

			summ = pot * (((c[counter] &gt;= '0' &amp;&amp; c[counter] &lt;= '9') ? c[counter]-'0' : -1));

			result = result + summ;
			pot=1;
		}
		return result; 
	} 

	int len(const char* st)
	{
		int counter=0;
		while (st[counter])
		{
			counter++;
		}
		return counter;
	}

	//
	//	Konstruktor / Copykonstruktor
	//
	///////////////////////////////////////////////////////////
	string::string()
	{
		m_string=0L;
	}

	string::string(const char* string)
	{	
		m_string=0L;
		cpychar(string);
	}

	string::string(const string&amp; prx)
	{
		m_string=0L;
		cpychar(prx.m_string);
	}

	//
	//	Destruktor
	//
	///////////////////////////////////////////////////////////
	string::~string()
	{
		if(m_string)
			delete[] m_string;
	}

	//
	//	Überladene Operatoren
	//
	///////////////////////////////////////////////////////////
	char*
	string::operator+(const char* t)
	{
		char* temp_char=new char[this-&gt;len()+prsx::len(t)];

		int counter=0;

		while(counter&lt;=this-&gt;len())
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		}

		counter--;
		while(counter&lt;=this-&gt;len()+prsx::len(t))
		{ 
			temp_char[counter]=t[counter-this-&gt;len()]; 
			counter++;
		}

		temp_char[counter]='\0';

		return temp_char;
	}

	char*
	string::operator+(string str)
	{
		char* t = str._char();

		char* temp_char=new char[this-&gt;len()+prsx::len(t)];

		int counter=0;

		while(counter&lt;=this-&gt;len())
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		}

		counter--;
		while(counter&lt;=this-&gt;len()+prsx::len(t))
		{ 
			temp_char[counter]=t[counter-this-&gt;len()]; 
			counter++;
		}

		temp_char[counter]='\0';

		return temp_char;
	}

	string&amp; 
	string::operator=(const char* t)
	{	
		cpychar(t);
		return *this;
	}

	string&amp; 
	string::operator=(const string&amp; prx)
	{
		if(this==&amp;prx)
			return *this;

		cpychar(prx.m_string);
		return *this;
	}

	bool 
	string::operator==(string prx)
	{
		if(this==&amp;prx)
			return true;
		if (len()!=prx.len())
			return false; 
		if(instr(prx._char(),0)==0)return false; 
			return true;
	}

	bool 
	string::operator==(const char* t)
	{
		if(this-&gt;len()!=prsx::len(t))
			return false;
		if(instr(t,0)==0)
			return false; 
		return true;
	}

	bool 
	string::operator!=(string prx)
	{
		if (len()!=prx.len())
			return true; 
		if(instr(prx._char(),0)==0)return true; 
			return false;
	}

	bool 
	string::operator!=(const char* t)
	{
		if (len()!=prsx::len(t))
			return true; 
		if(instr(t,0)==0)
			return true; 
		return false;
	}

	//
	//	private Methoden
	///////////////////////////////////////////////////////////

	//
	//	Kopiert str in m_string
	//
	void
	string::cpychar(const char* str)
	{
		delete[] m_string;

		m_string  = new char[prsx::len(str)+1];
		m_counter = 0;

		while(str[m_counter]!='\0')
		{
			m_string[m_counter]=str[m_counter];
			m_counter++;
		}

		m_string[m_counter]='\0';
	}

	//
	//	public Methoden
	//
	///////////////////////////////////////////////////////////

	//
	//	Länge von m_string
	//
	int 
	string::len()
	{
		int counter=0;
		while(m_string[counter])
		{
			counter++;
		}
		return counter;
	}

	//
	//	a Zeilen von links
	//
	string
	string::left(int a)
	{
		char* temp_char = new char[a+1];
		int counter=0;
		a--;
		while(counter&lt;=a)
		{ 
			temp_char[counter]=m_string[counter]; 
			counter++;
		} 
		temp_char[counter]='\0';
		string st=temp_char;

		delete[] temp_char;
		return st;
	}

	//
	//	a Zeilen von rechts
	//
	string
	string::right(int a)
	{
		int counter=0; 
		int l=this-&gt;len()-a;
		char* temp_char= new char[a+1];
		while(m_string[l+counter])
		{
			temp_char[counter]=m_string[l+counter];
			counter++;
		}
		temp_char[counter]='\0';
		string temp_parsx=temp_char;

		delete[] temp_char;
		return temp_parsx;
	}

	//
	//	a Zeilen ab b
	//
	string
	string::mid(int a, int b)
	{
		int counter=0;
		char* temp_char=new char[a+1];
		a--;
		while(counter&lt;=a)
		{
			temp_char[counter]=m_string[counter+b-1];
			counter++;
		}
		temp_char[counter]='\0';
		string temp_parsx=temp_char;

		delete[] temp_char;
		return temp_parsx;
	}

	//
	//	ist t ab a in parsx?
	//
	int 
	string::instr(const char* t, int a)
	{
		int	l = prsx::len(t);
		int counter = 0;

		if(a&lt;0)
			return 0;

		while(m_string[a])
		{
			while(t[counter])
			{
				if(t[counter]!=m_string[a+counter]) break;
				counter++;
				if(counter==l) return a+1;
			}
			counter=0;
			a++;
		}
		return 0;
	}

	//
	//	ist parsx ab a in parsx
	//
	int 
	string::instr(string st, int a)
	{
		char* temp_char=st._char();
		int	l = prsx::len(temp_char); 
		int counter = 0;

		if(a&lt;0) 
			return 0;

		while(m_string[a])
		{
			while(temp_char[counter])
			{
				if(temp_char[counter]!=m_string[a+counter]) 
					break;
				counter++;
				if(counter==l) return a+1;
			}
			counter=0;
			a++;
		}
	return 0;
	}

	//
	//	in Kleinbuchstaben umwandeln
	//
	string
	string::lower(void)
	{
		int counter=0;

		while(m_string[counter])
		{
			if(m_string[counter]&gt;64 &amp;&amp; m_string[counter]&lt;91)
				m_string[counter]=m_string[counter]+32;
			else
				m_string[counter]=m_string[counter];
			counter++;
		}

		return m_string;
	}

	//
	// Leerzeielen links und rechts löschen
	//
	void
	string::trim(void)
	{
		int front=0;
		while(m_string[front] &amp;&amp; m_string[front]==' ')
		{
			front++;
		}

		int back=len()-1;
		while(m_string[back] &amp;&amp; m_string[back]==' ')
		{
			back--;
		}
		back=len()-back;

		int a=len()-(front+back);

		char* temp = new char[a+1];

		int counter=0;
		while(counter&lt;=a)
		{ 
			temp[counter]=m_string[counter+front]; 
			counter++;
		} 

		temp[counter]='\0';

		cpychar(temp);
	}

	//
	//	char* zurückgeben
	//
	char*
	string::_char(void)
	{
		return m_string;
	}
};//namespace
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195114</guid><dc:creator><![CDATA[jeans]]></dc:creator><pubDate>Tue, 19 Dec 2006 21:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinug zum Code on Wed, 20 Dec 2006 00:32:07 GMT]]></title><description><![CDATA[<p>Örksel. Also nur was mir so auf die Schnelle auffällt...</p>
<ol>
<li>&quot;m_counter&quot; sollte besser &quot;m_length&quot; oder &quot;m_size&quot; heissen, oder ganz verschwinden, da es eh nicht verwendet wird</li>
<li>der Code ist an einigen Stellen nicht Exception Safe, das solltest du fixen</li>
<li>was du im Operator &quot;+&quot; aufführst ist Schwachsinn, ein temporäres Array mit &quot;new&quot; anlegen und anstatt es wieder zu löschen gibst du nen Zeiger darauf zurück???</li>
<li>die &quot;convert&quot; Funktion hat einen besseren Namen verdient, ist SEHR schräg implementiert, und ignoriert einfach alles was nicht 0-9 ist, zählt es aber (von der stellenwertigkeit) trotzdem als stelle??? (einfacher gesagt: interpretiert alles was nicht 1-9 ist als 0)</li>
<li>die parameter der &quot;mid&quot; Funktion sind gegenüber dem was man als quasi-standard erwartet vertauscht (mid ist fast immer &quot;mid(anfang, länge)&quot;), und hier haben die Parameter einen besseren Namen verdient (&quot;a&quot; und &quot;b&quot; sind nicht wirklich aussagekräftige Namen in diesem Zusammenhang)</li>
<li>du hast zumindest an einer Stelle ein memory leak, nämlich in der &quot;trim&quot; Funktion</li>
</ol>
<p>Ein paar Tips:<br />
* &quot;if(p) delete [] p;&quot; kannst du durch bloss &quot;delete [] p;&quot; ersetzen, ein delete auf einen 0 Pointer ist OK und tut einfach nix.<br />
* mach dir eine &quot;swap&quot; Funktion die einfach bloss alle Member tauscht, so dass du schnell 2 Strings gegeneinander tauschen kannst. Dazu machst du dann noch einen Konstruktor dem du einfach nur die Länge des Strings mitgibst, der halt passend viel Speicher anfordert. Damit kannst du viele Funktionen viel einfacher implementieren, nach dem Schema:</p>
<pre><code class="language-cpp">void string::append(char c)
{
    // alloc temp buffer
    string temp(m_length + 2); // NOTE: m_length ist the size of the string WITHOUT the terminating zero character, so we need m_length + 2 for the new string

    // copy contents (use memcpy if you don't mind using library functions!)
    for(size_t i = 0; i &lt; m_length; i++)
        temp.m_string[i] = m_string[i];

    // append char &amp; terminate new string
    temp.m_string[m_length] = c;
    temp.m_string[m_length + 1] = 0;

    // swap this vs. temp
    swap(temp);
    // temp now controls this string's old buffer and will release it properly
    // when it goes out of scope, which is just about ... now :)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195170</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 20 Dec 2006 00:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinug zum Code on Wed, 20 Dec 2006 21:50:12 GMT]]></title><description><![CDATA[<p>Da habe ich ja noch einiges Nachzubessern. Danke hustbaer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195748</guid><dc:creator><![CDATA[jeans]]></dc:creator><pubDate>Wed, 20 Dec 2006 21:50:12 GMT</pubDate></item></channel></rss>