Question

J'ai un ancien programme dans lequel une fonction de bibliothèque est utilisée et je n'ai pas cette bibliothèque.

J'écris donc ce programme en utilisant les bibliothèques de c ++. Dans cet ancien code, il existe une fonction appelée "

* string = newstrdup ("Une chaîne va ici");

la variable de chaîne est déclarée comme char ** chaîne;

Ce qu'il peut faire dans cette fonction nommée "newstrdup". ? J'ai essayé beaucoup de choses mais je ne sais pas ce qu'il fait ... Quelqu'un peut-il aider

Était-ce utile?

La solution

il doit y avoir une raison pour laquelle ils ont écrit un "nouveau" version de strdup. Donc, il doit y avoir un cas de coin qu'il gère différemment. comme peut-être une chaîne nulle renvoie une chaîne vide.

La réponse de

litb remplace strdup , mais je pense qu'il existe un raison pour laquelle ils ont fait ce qu'ils ont fait.

Si vous souhaitez utiliser directement strdup, utilisez une définition pour le renommer, plutôt que d'écrire du nouveau code.

Autres conseils

La fonction est utilisée pour copier les c-strings. 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 en écriture, une telle fonction les copie dans un tampon en écriture alloué. Vous pouvez ensuite les transmettre à des fonctions qui modifient leur argument donné, comme strtok , qui écrit dans la chaîne à tokenize.

Je pense que vous pouvez proposer quelque chose comme ceci, puisqu'il s'appelle nouveau strdup :

char * newstrdup(char const* str) {
    char *c = new char[std::strlen(str) + 1];
    std::strcpy(c, str);
    return c;
}

Vous êtes censé le libérer une fois que vous avez utilisé la chaîne à l'aide de

delete[] *string;

Une autre façon de l'écrire consiste à utiliser malloc . Si la bibliothèque est ancienne, elle a peut-être utilisé celle que C ++ a héritée 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 en C ++. Mais si le code existant utilise free pour libérer à nouveau la mémoire, utilisez la deuxième version. Attention, la deuxième version renvoie NULL si aucune mémoire n'est disponible pour dupliquer la chaîne, alors que la première lève une exception dans ce cas. Une autre remarque doit être prise concernant le comportement lorsque vous passez un argument NULL à votre newstrdup . Selon votre bibliothèque, cela peut être autorisé ou peut être interdit. Donc, insérez les contrôles appropriés dans les fonctions ci-dessus si nécessaire. Une fonction appelée strdup est disponible sur les systèmes POSIX, mais elle n'autorise pas les arguments NULL et n'utilise pas l'opérateur C ++ nouveau pour allouer de la mémoire. .

Quoi qu’il en soit, j’ai cherché dans Google codesearch des fonctions newstrdup et en ai trouvé quelques-unes. Peut-être que votre bibliothèque est parmi les résultats:

Google CodeSearch, newstrdup

La ligne * string = newstrdup ("Une chaîne va ici"); ne montre aucune bizarrerie à newstrdup . Si chaîne a le type char ** , alors newstrdup renvoie simplement char * comme prévu. On présume que chaîne était déjà configuré pour pointer vers une variable de type char * dans laquelle le résultat doit être placé. Sinon, le code écrit via un pointeur non initialisé.

newstrdup est probablement en train de créer une nouvelle chaîne qui est une copie de la chaîne transmise; elle renvoie un pointeur sur la chaîne (qui est elle-même plus pointue sur les caractères).

On dirait qu'il a écrit une fonction strdup () pour opérer sur un pointeur existant, probablement pour le réattribuer à une nouvelle taille, puis remplir son contenu. Il fait probablement cela pour réutiliser le même pointeur dans une boucle où * une chaîne va changer fréquemment tout en empêchant une fuite à chaque nouvel appel à strdup ().

Je mettrais probablement en œuvre cela comme string = redup (& string, "nouveau contenu") .. mais c'est juste moi.

Modifier :

Voici un extrait de ma fonction 'redup' qui pourrait ressembler à ce que vous avez posté, mais d'une manière différente:

int redup(char **s1, const char *s2)
{
    size_t len, size;

    if (s2 == NULL)
        return -1;

    len = strlen(s2);
    size = len + 1;

    *s1 = realloc(*s1, size);

    if (*s1 == NULL)
        return -1;

    memset(*s1, 0, size);
    memcpy(*s1, s2, len);

    return len;
}

Bien sûr, je devrais probablement sauvegarder une copie de * s1 et la restaurer si realloc () échoue, mais je n'avais pas besoin d'obtenir ce paranoïa.

Je pense que vous devez regarder ce qui se passe avec la "chaîne". La variable dans le code en tant que prototype de la fonction newstrdup () semblerait être identique à la version de la bibliothèque strdup ().

Le code contient-il des appels libres (* chaîne)?

Cela semblerait être une chose étrange, sauf si vous conservez en interne une copie de la chaîne dupliquée et ramenez à nouveau un pointeur sur la même chaîne.

Encore une fois, je demanderais pourquoi?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top