<?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[Die Sache strncpy&#x2F;memcpy]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich komme gerade nicht bei meinem Programm weiter, welches eine Datei öffnen , die Zeile in einer ausgelagerten Funktion vergleichen soll und diese bei Erfolg in dem Array</p>
<pre><code>LRED[LREDP]
LREDP // Counter der Felder
</code></pre>
<p>speichern soll. Das funltioniert aber nicht, da dann sofort meine App crasht. Soll ich dafür strncpy oder memcpy benutzen?<br />
Und warum funktioniert</p>
<pre><code>LRED[LREDP] = lineBuffer;
</code></pre>
<p>nicht? Sobald ich das nämlich verwende, ist auf einmal jede Zeile, welcher in lineBuffer gespeichert ist in LRED[LREDP]?!</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;malloc.h&gt;
using namespace std;

int _tmain( int argc, _TCHAR* argv[] )
{
	// Deklarationen
	unsigned int *LREDNum;
	int LREDP = 0, i;
	char **LRED;
	char lineBuffer[512];
	char file[512];

	LRED = (char**) malloc( MINCYCLEHITS * sizeof(char*) );
	LREDP = (unsigned int*) malloc( MINCYCLEHITS * sizeof(int*) );

	FILE *stream;
	fopen_s( &amp;stream, file, &quot;r&quot; );

	// Pruefen, ob Stream existiert
	if( stream != NULL )
	{
		// Datei Zeilenweise durchlaufen
		while( !feof( stream ) )
		{
			// Puffer leeren
			strcpy_s( lineBuffer, sizeof( lineBuffer ), &quot;&quot; );

			/ Zeile einlesen
			fgets( lineBuffer, sizeof( lineBuffer ) - sizeof( lineBuffer[0] ), stream );

			// Zeilenumbruch loeschen
			if( lineBuffer[ strlen(lineBuffer)-1 ] == '\n' )
				lineBuffer[ strlen(lineBuffer)-1 ] = 0x0;

			// String Null-Terminieren
			lineBuffer[512-1] = '\0';
			if( ThisFleLine(profileFile, lineBuffer) )
			{
				// Array erweitern
				if( LREDP == MINCYCLEHITSB )
				{
					LRED = (char**) realloc( LRED, LREDP * sizeof(LRED[0]) );
					LREDP = (unsigned int*) realloc( LREDNum, LREDP * sizeof(int) );
				}

				LREDP[LREDP] = row;
				strncpy_s(LRED[LREDP], 512, lineBuffer, _TRUNCATE);
                (*LRED)[512-1] = '\0';
				LREDP++;
			}
			// Inkrementieren der aktuellen Zeilennummer
			row++;
		}
		// Stream schliessen
		fclose(stream);

		// Speicher freigeben
		free(LRED);
		free(LREDNum);
	}
	return 0;
}
</code></pre>
<p>Ich hoffe ihr könnte mir helfen.</p>
<p>Ciao,<br />
Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254429/die-sache-strncpy-memcpy</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 17:39:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254429.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Nov 2009 14:23:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 17:08:59 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich komme gerade nicht bei meinem Programm weiter, welches eine Datei öffnen , die Zeile in einer ausgelagerten Funktion vergleichen soll und diese bei Erfolg in dem Array</p>
<pre><code>LRED[LREDP]
LREDP // Counter der Felder
</code></pre>
<p>speichern soll. Das funltioniert aber nicht, da dann sofort meine App crasht. Soll ich dafür strncpy oder memcpy benutzen?<br />
Und warum funktioniert</p>
<pre><code>LRED[LREDP] = lineBuffer;
</code></pre>
<p>nicht? Sobald ich das nämlich verwende, ist auf einmal jede Zeile, welcher in lineBuffer gespeichert ist in LRED[LREDP]?!</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;malloc.h&gt;
using namespace std;

int _tmain( int argc, _TCHAR* argv[] )
{
	// Deklarationen
	unsigned int *LREDNum;
	int LREDP = 0, i;
	char **LRED;
	char lineBuffer[512];
	char file[512];

	LRED = (char**) malloc( MINCYCLEHITS * sizeof(char*) );
	LREDP = (unsigned int*) malloc( MINCYCLEHITS * sizeof(int*) );

	FILE *stream;
	fopen_s( &amp;stream, file, &quot;r&quot; );

	// Pruefen, ob Stream existiert
	if( stream != NULL )
	{
		// Datei Zeilenweise durchlaufen
		while( !feof( stream ) )
		{
			// Puffer leeren
			strcpy_s( lineBuffer, sizeof( lineBuffer ), &quot;&quot; );

			/ Zeile einlesen
			fgets( lineBuffer, sizeof( lineBuffer ) - sizeof( lineBuffer[0] ), stream );

			// Zeilenumbruch loeschen
			if( lineBuffer[ strlen(lineBuffer)-1 ] == '\n' )
				lineBuffer[ strlen(lineBuffer)-1 ] = 0x0;

			// String Null-Terminieren
			lineBuffer[512-1] = '\0';
			if( ThisFleLine(profileFile, lineBuffer) )
			{
				// Array erweitern
				if( LREDP == MINCYCLEHITSB )
				{
					LRED = (char**) realloc( LRED, LREDP * sizeof(LRED[0]) );
					LREDP = (unsigned int*) realloc( LREDNum, LREDP * sizeof(int) );
				}

				LREDP[LREDP] = row;
				strncpy_s(LRED[LREDP], 512, lineBuffer, _TRUNCATE);
                (*LRED)[512-1] = '\0';
				LREDP++;
			}
			// Inkrementieren der aktuellen Zeilennummer
			row++;
		}
		// Stream schliessen
		fclose(stream);

		// Speicher freigeben
		free(LRED);
		free(LREDNum);
	}
	return 0;
}
</code></pre>
<p>Ich hoffe ihr könnte mir helfen.</p>
<p>Ciao,<br />
Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1808802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1808802</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Wed, 18 Nov 2009 17:08:59 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Mon, 16 Nov 2009 15:27:50 GMT]]></title><description><![CDATA[<p>Wenns ein String ist (und das isses ja), nimm strcpy/strncpy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1808861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1808861</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Mon, 16 Nov 2009 15:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Mon, 16 Nov 2009 18:00:45 GMT]]></title><description><![CDATA[<p>Wie würde der Aufruf bei <em>strcpy_s();</em> aussehen?</p>
<p>Ich habe das schon ohne Erfolg so probiert:</p>
<pre><code class="language-cpp">strcpy_s(LRED[LREDP], sizeof(char[512]), lineBuffer);
</code></pre>
<p>Lg,<br />
Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1808952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1808952</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Mon, 16 Nov 2009 18:00:45 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Mon, 16 Nov 2009 21:12:52 GMT]]></title><description><![CDATA[<p>Habe mich jetzt doch für strncpy entschienden.</p>
<p>Habe mir auch schon die MSDN dazu durchgelesen und das<br />
in meinem Programm ausprobiert, jedoch ihne erfolg.</p>
<p>Kann mir bitte jemand die passenden Variablen in strncpy<br />
einfügen und das dann posten pls?</p>
<p>Liebe Grüße</p>
<p>Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1809055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1809055</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Mon, 16 Nov 2009 21:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Tue, 17 Nov 2009 20:26:19 GMT]]></title><description><![CDATA[<p>Kann mir bitte jemand helfen, ich habe schon Studen vor dem Problemcodebaustein verbracht - leider ohne Erfolg.</p>
<p>Bitte, bitte, bitte, ich komme sonst nicht weiter.</p>
<p>Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1809588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1809588</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Tue, 17 Nov 2009 20:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 08:42:09 GMT]]></title><description><![CDATA[<p>Grundsätzlich die wichtigsten Fragen:<br />
Wie crasht denn Deine App? Fehlermeldung?<br />
Kannst Du einen Debugger anwerfen?</p>
<p>Nun, hab mir mal ein bißchen durch Dein Code gelesen.</p>
<p>Folgendes ist mir aufgefallen:</p>
<pre><code class="language-cpp">LRED = (char**) malloc( MINCYCLEHITS * sizeof(char[512]) );
LRED = (char**) malloc( MINCYCLEHITS * sizeof(char[512]) );
</code></pre>
<p>Warum zweimal?<br />
Unabhängig davon, da Du den ersten zurückgegebenen Pointer beim zweiten Mal verloren hast, kannst Du den ersten allokierten Speicher nie mehr freigeben!</p>
<pre><code class="language-cpp">// String Null-Terminieren
lineBuffer[ strlen( lineBuffer ) ] = '\0';
</code></pre>
<p>Das ist sehr gefährlich! Denn <em>strlen()</em> kann nur sicher funktionieren, wenn sichergestellt ist, daß <em>lineBuffer</em> bereits eine Nullterminierung enthält!<br />
Was aber in diesem Falle absurd ist.<br />
Also besser so:</p>
<pre><code class="language-cpp">// Zeile einlesen
fgets( lineBuffer, sizeof( lineBuffer ) - sizeof( lineBuffer[0] ), stream );
                   //Ein Zeichen weniger einlesen als die Buffergröße selbst, da Platz für die Nullterminierung benötigt wird!

// String Null-Terminieren
lineBuffer[512-1] = '\0';
</code></pre>
<pre><code class="language-cpp">if( ThisFleLine(profileFile, lineBuffer) )
</code></pre>
<p>Was macht denn diese Funktion <em>ThisFleLine()</em>?<br />
Geschweige denn, was ist <em>profileFile</em> ???</p>
<p>Und last but not least:<br />
Was ist eigentlich <em>MINCYCLEHITS</em>?</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1809724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1809724</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Wed, 18 Nov 2009 08:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 15:33:57 GMT]]></title><description><![CDATA[<p>Hallo Mmacher,</p>
<p>ich habe jetzt deine Änderungen in meinen Source eingebaut und diesen editiert.</p>
<p>Meine App crasht mit der Meldung: &quot;Unbehandelte Ausnahme in Compare.exe [1548].&quot;</p>
<p>Der Just-In-Time-Debugger von VS2005 meldet mir den folgenden Fehler:</p>
<pre><code>Compare.exe!strncpy_s(char * _Dst=0xcdcdcdcd, unsigned int _SizeInBytes=512, const char * _Src=0x0012fb34, unsigned int _Count=4294967295)  Zeile 37 + 0x8 Bytes	C
</code></pre>
<pre><code>ThisFleLine(char* profileFile, char* profileFile);
</code></pre>
<p>Die Funktion überprüft, ob der String mit einem anderen aus einer anderen Datei übereinstimmt.<br />
Darin kann der Fehler nicht liegen.</p>
<pre><code>MINCYCLEHITS
</code></pre>
<p>Ist eine Deininition für den Precompiler, welches den Wert 2 hat.</p>
<p>Vielen Dank für deine bisherige Hilfe Mmacher. Du hast mir damit schon sehr weitergeholfen.</p>
<p>Lg,<br />
Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1809971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1809971</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Wed, 18 Nov 2009 15:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 17:11:18 GMT]]></title><description><![CDATA[<p>Ja und. Dann schau in den Callstack und Du siehst wo es krachtund wo die Zeiger und Variablen stehen.</p>
<p>Für was denkst Du gibt es einen Debugger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810009</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 18 Nov 2009 17:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 17:45:32 GMT]]></title><description><![CDATA[<p>Thindia80 schrieb:</p>
<blockquote>
<pre><code>Compare.exe!strncpy_s(char * _Dst=0xcdcdcdcd, unsigned int _SizeInBytes=512, const char * _Src=0x0012fb34, unsigned int _Count=4294967295)  Zeile 37 + 0x8 Bytes	C
</code></pre>
</blockquote>
<p>Sieh dir mal deinen Zielpuffer an (0xcdcdcdcd). Du übergibst einen Zeiger, dem du gar keinen Speicher zugewiesen hast.</p>
<p>Wenn du so einen Zeiger deklarierst</p>
<pre><code class="language-cpp">char *pString;
</code></pre>
<p>Dann kannst du da noch lange nicht reinschreiben. Das ist nur ein Zeiger, der zeigt aber auf nix. Du musst Speicher reservieren mit malloc oder new. Lies dir mal die Artikel auf dieser Webseite zu den Themen Pointer und Speicherverwaltung durch.</p>
<p>Thindia80 schrieb:</p>
<blockquote>
<pre><code>ThisFleLine(char* profileFile, char* profileFile);
</code></pre>
<p>Die Funktion überprüft, ob der String mit einem anderen aus einer anderen Datei übereinstimmt.<br />
Darin kann der Fehler nicht liegen.</p>
</blockquote>
<p>Kommt ganz drauf an, wie die Funktion aussieht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810028</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 18 Nov 2009 17:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Wed, 18 Nov 2009 20:41:27 GMT]]></title><description><![CDATA[<p>Aber in meinem oben genanntem Source Reserviere ich doch Speicher mit</p>
<pre><code class="language-cpp">LRED = (char**) malloc( MINCYCLEHITS * sizeof(char*) );
    LREDP = (unsigned int*) malloc( MINCYCLEHITS * sizeof(int*) );
</code></pre>
<p>Ich bitte einfach, mir den Fehler zu zeigen. Ich habe echt Respekt vor den ganzen C++ Gurus hier, muss mir aber selbst eingestehen leider nicht dazuzugehören - noch nicht.</p>
<p>Einen schönen Abend,</p>
<p>Thindia80</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810125</guid><dc:creator><![CDATA[Thindia80]]></dc:creator><pubDate>Wed, 18 Nov 2009 20:41:27 GMT</pubDate></item><item><title><![CDATA[Reply to Die Sache strncpy&#x2F;memcpy on Thu, 19 Nov 2009 06:07:24 GMT]]></title><description><![CDATA[<p>Na ja, was soll denn überhaupt LREDP sein? Du deklarierst diese Variable als int (also nicht als Zeiger), weist ihr dann aber die Rückgabe von malloc/realloc (also eine Adresse!) zu. Und dann wiederum benutzt du sie als Index für LRED. Das kann ja nur schiefgehen.</p>
<pre><code class="language-cpp">int LREDP=0;
...
LREDP=malloc... //hier wird eine Speicheradresse zugewiesen, z.B. 0x12345678
...
strncpy_s(LRED[LREDP], 512, lineBuffer, _TRUNCATE);  //hier schreibst du jetzt an die Stelle LRED[0x12345678]
</code></pre>
<p>Nicht ganz, was du willst, oder? Lass bei LREDP einfach mal den ganzen malloc-Quatsch weg, dann wird die Variable mit 0 initialisiert und später in der Schleife inkremeniert, was du vermutlich eher willst (oder?).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810249</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 19 Nov 2009 06:07:24 GMT</pubDate></item></channel></rss>