Tengo una función que tiene dos enteros y devuelve una cadena. En este momento tengo esto:manera correcta devolver una cadena desde una función
char* myfunc(int a, int b, int* len)
{
int retLen = ...
char* ret = malloc(retLen + 1);
if (len != NULL)
{
*len = retLen;
}
return ret;
}
Sin embargo, la mayoría de las funciones de la biblioteca C tienden a hacer algo más como:
int myfunc(char* ret, int a, int b)
{
...
return retLen;
}
Se espera entonces para asignar la memoria para la función de llenar. Esto le permite hacer un poco más como elegir dónde se asigna la cadena.
En este caso, aunque se requieren algunos cálculos en la función para obtener la longitud, y no hay razón para tener un búfer de cualquier tamaño que no sea el necesario. No hay un límite superior en el tamaño del búfer (no uno que sea razonable de todos modos).
¿Qué se considera una buena práctica al devolver una cadena cuya longitud se encuentra dinámicamente dadas las entradas?
Por supuesto, con este patrón, pasaría la longitud junto con el puntero. Incluso podría ser un parámetro de entrada/salida (pasado como 'size_t *'). – cHao
Sí, de hecho, edité la firma. – clyfe
Muy buena respuesta que ayuda mucho, así que gracias. Sin embargo, un par de preguntas: ¿por qué se prefiere a una función como 'size_t myfunc (char * output, size_t given, ...)' que efectivamente devuelve 'needed_or_resulted' para que el usuario la compare y obtenga su propio significado para el éxito? Además, ¿por qué se prefiere esto a una segunda función como 'myfuncLength' que hace los cálculos de longitud necesarios? – Matt