strcpy ... wollen mit strcpy_mine ersetzen, die wird Strncpy und null beenden
Frage
ist der Hinweis im Titel, aber im Grunde habe ich einige Codes geerbt, die 800+ Instanzen von strcpy hat. Ich möchte eine neue Funktion schreiben und dann strcpy mit strcpy_mine zu ersetzen.
Also ich versuche, herauszufinden, was Parameterliste strcpy_mine haben wird.
Ich habe versucht:
void strcpy_mine( char* pTarget, const char* const pCopyMe )
{
const unsigned int lenAlwaysFour = sizeof(pCopyMe ); //:(
strncpy( pTarget, pCopyMe, lenAlwaysFour );
//add extra terminator in case of overrun
pTarget[lenAlwaysFour] = 0;
}
aber die sizeof ist immer 4 pCopyMe ist ein Zeiger
, was ich will nicht tun, ersetzen
strcpy (buf, pCopyMe);
mit
strncpy (buf, pCopyMe, sizeof(pCopyMe)); buf[sizeof(pCopyMe)] = 0;
irgendwelche Ideen? (Strcpy_l ist nicht verfügbar)
cheers
Lösung
Je nachdem, wie die Call-Sites aussehen, oft meisten Fällen kann durch eine einfache Vorlage behandelt werden:
#include <string.h>
template <int bufferSize>
void strcpy_mine( char (&pTarget)[bufferSize], const char* const pCopyMe )
{
strncpy( pTarget, pCopyMe, bufferSize-1 );
//add extra terminator in case of overrun
pTarget[bufferSize-1] = 0;
}
int main()
{
char buf[128];
strcpy_mine(buf,"Testing");
return 0;
}
Wenn Sie mit Microsoft Visual Studio 2005 oder höher finden Sie unter
Andere Tipps
sizeof () gibt die Größe des Typs -. In diesem Fall const char* const
die 4 auf 32-Bit-Maschinen sein
Ich glaube, Sie denken, Sie strlen()
wollen. Aber das ist nicht der richtige Weg Strncpy Funktionen zu nutzen.
Sie müssen die Größe des Ausgang Puffer für strncpy.
Um dies zu beheben, müssen Sie den Code bei jedem Anruf Ort zu untersuchen und herauszufinden, die Größe des Ausgangspuffers, und übergeben Sie das als Argument an strcpy_mine
. Wenn der Anruf Ort für strcpy (oder strcpy_mine) nicht die Größe des Ausgangspuffers weiß, müssen Sie zurück in dem Code für den Standort suchen, die den Puffer reserviert, und übergeben Sie die Größe des ganzen Weg hinunter zur strcpy Website .
Grundsätzlich kann man nicht ein direkter Ersatz für strcpy schreiben, die die gleichen Argumente nimmt und hoffen, die Probleme zu vermeiden, die Strncpy in erster Linie produziert (und besser Ersatz darüber hinaus). Sie können eine Funktion erstellen, die die gleichen Argumente wie Strncpy nimmt, sondern sorgt dafür, das Ergebnis ist nullterminierte - Blick auf die Umsetzung der OpenBSD strlcpy () Funktion. Aber der erste Schritt hat die Berufung Websites auf der Kenntnis der Ausgangspuffergröße passieren zu ändern.
Etwas periphere vielleicht, aber da niemand erwähnt, und es ist im Titel zur Schau gestellt. Sie können nicht (rechtlich) eine globale Funktion strcpy_mine()
genannt schreiben
Der „Namensraum“ von Funktionen, deren Namen mit str
beginnt für die Standardbibliothek reserviert. Siehe zum Beispiel die akzeptierte Antwort auf diese Frage .
Sie könnten die gleiche Parameterliste als Strncpy für Ihre strcpy_mine verwenden, aber es schreiben, so dass es immer null das Ergebnis beendet. Sollte nicht sehr schwer zu tun.
Eine Herausforderung ist jedoch, dass möglicherweise nicht wissen, die Größe des Puffers einige Ihres bestehenden Code, strcpy () aufruft, auch nicht.
Sie können auch verwenden macroses für vermeiden mehrere editings. Oder automatisiert über einige Skript zu bearbeiten.
Sie müssen auf jeden Fall in der Größe des Zielpuffers als Parameter zu übergeben, wie andere Leute über gesagt haben.
Dies ist eine Art von Off-Topic, aber ich möchte nur darauf hinweisen, dass, nachdem Sie strncpy()
verwenden, müssen Sie setzen das letzte Zeichen des Puffers auf null, der Index hat 1 weniger als die Länge (nicht die Länge des Puffers):
strncpy (buf, pCopyMe, buflen); buf[buflen - 1] = '\0';
oder alternativ Sie strncat()
auf eine leere Zeichenfolge verwenden können, ist es eine Länge vorbei, die mit 1 weniger ist, und es wird gewährleistet, auf Null-kündigen Ihre string:
buf[0] = '\0'; strncat (buf, pCopyMe, buflen - 1);
Douglas Leeder hat es richtig. Es gibt eine Grenze für die Nützlichkeit strcpy zu ersetzen, wenn Sie bereit sind, die Hauptarbeit der Weitergabe in einer guten, gesunden Pufferlänge bei jeder Instanz zu tun. Das ist eine Menge Arbeit!
Die gute Nachricht ist, es lohnt sich! Zurück vor ein paar Jahren kam ich auf mehreren C ++ Projekte, die spät dran waren, Buggy und unzuverlässig. Durch die Deklaration strcpy und Strlen verboten, und 2-3 Tage aus dem Projekt teilnehmen ersetzen sie durch individuelle Strncpy / strnlen, in all diesen Projekten plötzlich für Tage, die wir statt Stunden laufen konnten. Wir sahen auch viele abgeschnittenen Strings kommen auf dem Bildschirm angezeigt und Protokolldateien. Das gab uns die Hinweise, die Abschneide Probleme aufzuspüren erforderlich, früher Absturz Probleme.
Wenn Sie dies nicht tun, können Sie einen viel kleineren Vorteil erhalten, indem einfach für NULL beiden Zeigerparameter überprüft, und die Begrenzung der maximale Größe eines Strings kopieren und alle Zeiten Protokollierung, dass die Grenze erreicht ist. ein strlen entweder Parameter nicht, wie strlen wird auf Sie glücklich abstürzen, wenn die Zeichenfolge nicht korrekt ist null beendet.
Heutzutage verwenden, um neue Projekte gut String-Objekte, aber es gibt da draußen eine Menge von Legacy-Code, der dies nicht tut.