Pregunta

Tengo un programa antiguo en el que se usa alguna función de biblioteca y no tengo esa biblioteca.

Entonces estoy escribiendo ese programa usando bibliotecas de c ++. En ese código antiguo hay alguna función que se llama así

* string = newstrdup (" Alguna cadena va aquí ");

la variable de cadena se declara como cadena char **;

Lo que puede estar haciendo en esa función llamada " newstrdup " ? Probé muchas cosas, pero no sé lo que está haciendo ... ¿Alguien puede ayudar?

¿Fue útil?

Solución

tiene que haber una razón por la que escribieron un " nuevo " versión de strdup. Por lo que debe haber un caso de esquina que se maneja de manera diferente. como quizás una cadena nula devuelve una cadena vacía.

la respuesta de litb es un reemplazo para strdup , pero creo que hay una razón por la que hicieron lo que hicieron.

Si desea usar strdup directamente, use una definición para cambiarle el nombre, en lugar de escribir un nuevo código.

Otros consejos

La función se utiliza para hacer una copia de c-strings. A menudo se necesita para obtener una versión de escritura de una cadena literal. Ellos (los literales de cadena) no son de escritura, por lo que tal función los copia en un búfer de escritura asignado. Luego, puede pasarlos a las funciones que modifican el argumento dado, como strtok , que escribe en la cadena que tiene que tokenizar.

Creo que puedes llegar a algo como esto, ya que se llama new strdup :

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

Se supone que debes liberarlo una vez que hayas terminado usando la cadena usando

delete[] *string;

Una forma alternativa de escribirlo es mediante malloc . Si la biblioteca es antigua, puede haberla utilizado, que C ++ heredó de C:

char * newstrdup(char const* str) {
    char *c = (char*) malloc(std::strlen(str) + 1);
    if(c != NULL) {
        std::strcpy(c, str);
    }
    return c;
}

Ahora, se supone que debes liberar la cadena usando free cuando hayas terminado:

free(*string);

Prefiere la primera versión si estás escribiendo con C ++. Pero si el código existente usa free para desasignar la memoria nuevamente, use la segunda versión. Tenga en cuenta que la segunda versión devuelve NULL si no hay memoria disponible para duplicar la cadena, mientras que la primera lanza una excepción en ese caso. Se debe tomar otra nota sobre el comportamiento cuando pasa un argumento NULL a su newstrdup . Dependiendo de su biblioteca, se puede permitir o no. Así que inserte los controles apropiados en las funciones anteriores si es necesario. Hay una función llamada strdup disponible en los sistemas POSIX, pero esa no permite los argumentos de NULL ni utiliza el operador C ++ nuevo para asignar memoria .

De todos modos, he buscado en google codesearch las funciones de newstrdup y he encontrado algunas. Quizás tu biblioteca esté entre los resultados:

Google CodeSearch, newstrdup

La línea * string = newstrdup (" Alguna cadena va aquí "); no muestra ninguna rareza en newstrdup . Si string tiene el tipo char ** , entonces newstrdup simplemente está devolviendo char * como se esperaba. Presumiblemente, cadena ya estaba configurado para apuntar a una variable de tipo char * en la que se colocará el resultado. De lo contrario, el código se escribe a través de un puntero sin inicializar.

newstrdup probablemente está creando una nueva cadena que es un duplicado de la cadena pasada; devuelve un puntero a la cadena (que a su vez es más puntual que los caracteres).

Parece que ha escrito una función strdup () para operar en un puntero existente, probablemente para reasignarlo a un nuevo tamaño y luego rellenar su contenido. Probablemente, está haciendo esto para reutilizar el mismo puntero en un bucle donde * la cadena cambiará con frecuencia al tiempo que evita una fuga en cada llamada subsiguiente a strdup ().

Probablemente lo implementaría como string = redup (& amp; string, " nuevo contenido ") .. pero eso es solo yo.

Editar :

Aquí hay un fragmento de mi función de 'redup' que podría estar haciendo algo similar a lo que publicaste, solo de una manera diferente:

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;
}

Por supuesto, probablemente debería guardar una copia de * s1 y restaurarla si falla realloc (), pero no necesitaba obtener ese paranoico.

Creo que necesitas ver lo que está sucediendo con la cadena " " La variable dentro del código como prototipo para la función newstrdup () parecería ser idéntica a la versión de la biblioteca strdup ().

¿Hay alguna llamada gratuita (* cadena) en el código?

Parecería una cosa extraña, a menos que se mantenga internamente una copia de la cadena duplicada y se devuelva un puntero a la misma cadena nuevamente.

De nuevo, me preguntaría por qué?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top