La fonction permet d'effectuer une copie des chaînes de caractères. Cela est souvent nécessaire pour obtenir une version en écriture d'un littéral de chaîne. Ils (littéraux de chaîne) ne sont pas inscriptibles, donc une telle fonction les copie dans un tampon accessible en écriture. Vous pouvez ensuite les passer à des fonctions qui modifient leur argument donné, comme strtok
qui écrit dans la chaîne qu'il doit marquer.
Je pense que vous pouvez venir avec quelque chose comme ça, car il est appelé nouvelle strdup:
char * newstrdup(char const* str) {
char *c = new char[std::strlen(str) + 1];
std::strcpy(c, str);
return c;
}
Vous seriez censé libérer une fois fait en utilisant la chaîne à l'aide
delete[] *string;
Une autre façon d'écrire est d'utiliser malloc
. Si la bibliothèque est vieux, il a peut-être utilisé que, qui C++ hérité de C:
char * newstrdup(char const* str) {
char *c = (char*) malloc(std::strlen(str) + 1);
if(c != NULL) {
std::strcpy(c, str);
}
return c;
}
Maintenant, vous êtes censé libérer la chaîne en utilisant free
lorsque vous avez terminé:
free(*string);
Préférez la première version si vous écrivez avec C++.Mais si le code existant utilise free
pour libérer à nouveau la mémoire, utilisez la deuxième version. Méfiez-vous que la deuxième version renvoie NULL
si aucune mémoire n'est disponible pour doubler la chaîne, tandis que la première renvoie une exception dans ce cas. Une autre note doit être prise au sujet du comportement lorsque vous transmettez un argument NULL
à votre newstrdup
. Selon votre bibliothèque qui peut être autorisée ou non autorisée. Insérez donc les vérifications appropriées dans les fonctions ci-dessus si nécessaire. Il existe une fonction appelée strdup
disponible dans les systèmes POSIX, mais celle-ci n'autorise aucun argument NULL
et n'utilise pas non plus l'opérateur C++
pour allouer de la mémoire.
Quoi qu'il en soit, j'ai regardé avec google codesearch pour newstrdup
fonctions et trouvé un certain nombre. Peut-être que votre bibliothèque est parmi les résultats:
Google CodeSearch, newstrdup
Pouvez-vous coller la fonction newstrdup()? –
@tinkertim: "J'ai un ancien programme dans lequel une fonction de bibliothèque est utilisée et je n'ai pas cette bibliothèque" ... –
Pouvez-vous coller un ancien code où newstrdup est utilisé? De préférence à l'intérieur d'une boucle. Avez-vous une déclaration pour newstrdup à partir d'un fichier .h? – jmucchiello