# Was statt strcpy?



## Unicate (3. April 2006)

Ich habe jetzt mehrfach gelesen, das strcpy nicht sehr gut ist, weil er ohne die Länge des Strings zu überprüfen Kopiert, was zu einem Buffer Overflow führen kann.

Aber was nehme ich stattdessen?
selber schreiben?
ich würde sowas in der art machen:


```
function strcpy2(*target, *source)
{
  int iLen = 0, iLen2 = 0, i =0;
  iLen = strlen(source);
  iLen2 = sizeof(target);
  if(iLen2 >= iLen)
  {
    for(i=0; i<=iLen;i++)
    {
      *target[i] = *source[i];
    }
    return 0;
  }
  return 2;
}
```

Wäre das besser als strcpy?


----------



## deepthroat (3. April 2006)

Unicate hat gesagt.:
			
		

> Wäre das besser als strcpy?


Es gibt da die Funktion strncpy die nur eine bestimmte Anzahl von Zeichen kopiert.
	
	
	



```
#include <string.h>

char *strncpy(char *restrict s1, const char *restrict s2, size_t n);
```



			
				Unicate hat gesagt.:
			
		

> ```
> iLen2 = sizeof(target);
> ```


Das geht so nicht. Das Ergebnis ist bei jedem Zeiger immer gleich - nämlich die Größe des Zeigers, nicht die Größe des Speicherbereichs auf den er zeigt. Der sizeof Operator ermittelt die Größe des Arguments zur Kompilierzeit, nicht zur Laufzeit!

Microsoft stellt weitere (sicherere) Versionen seit Visual C++ 7 (denke ich) bereit: strncpy_s, strcpy_s usw. (siehe z.B. http://msdn.microsoft.com/msdnmag/issues/05/05/SafeCandC/)

Gruß


----------



## Unicate (3. April 2006)

sollte auch nicht funktionieren, war nur pseudocode... das Prinzip war mir wichtig.

Aber ok, ich denke strncpy ist gut... hatte ich vergessen.

Ausserdem ist MS *würg*... ok lassen wir das, kein normaler Mensch hat das Geld dazu sich nen Visual Studio zu kaufen und das Gewinnbringend zu nutzen.
Geht leider nur entweder oder...

Bin im Linux und programmiere mit Eclipse, das kost mich alles 0 Euro

Weiß jemand obs das (strcpy_s) auch für Linux gibt?
Wenn ja, in welcher header?


----------



## FireFlow (3. April 2006)

<Sorry OT> Sagmal wer hat denn dieses Flash auf eurer Seite erstellt? Richtig unhöflich... Man nennt immer zuerst die Dame, dann den Herrn  </OT>

Die Funktion ist wie gesagt in <string.h>, aber afaik erst seit C99 vorhanden. Falls Du C++ programmierst solltest Du stattdessen besser gleich std::string verwenden.

Gruß


----------



## rohrbold (4. April 2006)

FireFlow hat gesagt.:
			
		

> Die Funktion ist wie gesagt in <string.h>, aber afaik erst seit C99 vorhanden. Falls Du C++ programmierst solltest Du stattdessen besser gleich std::string verwenden.



Also falls Du Dich auf strncpy beziehst, so muss ich richtigstellen, dass es diese schon länger gibt. Sie wird im Kernighan & Ritchie bereits vorgestellt und ist Bestandteil von C90.
Bezüglich std:string muss ich Dir rechtgeben -- wo immer möglich würde ich C++ Merkmale den reinen C Methoden vorziehen, wenn man schon in C++ programmiert.


----------

