strcpy ... wollen mit strcpy_mine ersetzen, die wird Strncpy und null beenden

StackOverflow https://stackoverflow.com/questions/951119

  •  11-09-2019
  •  | 
  •  

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

War es hilfreich?

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top