[C con Clase] acerca del rendimiento de strlen

Steven Davidson steven en conclase.net
Mie Mar 14 07:03:31 CET 2007


Hola Miguel,

El pasado 2007-03-14 05:00:47, miguel escribió:

m> buenas, resulta que estuve trabajando en java en vacaciones (eso se notó bastante cuando volví a abrir este correo esta tarde y me encontré con la pequeña cantidad de 637 mensajes de conclase), y esto hizo que olvidara algunas cosas de c, por ejemplo la función strlen, pero el caso es que en algún momento tuve que crear una cadena a partir de otra, para lo que necesitaba la longitud de esta cadena, pues al no recordar esta función decidí hacer lo siguiente:
m> char []pCadena="hola mundo"; //mi antigua cadena

Pues sí; parece que has estado enfocado más con Java que con C++ :)  Lo anterior, bajo C/C++, es incorrecto. Debería ser:

char pCadena[] = "hola mundo";

Pero bueno, no es lo primordial de la cuestión, en estos momentos.

m> char *nCadena=new char[sizeof(pCadena)/sizeof(char)];  //mi nueva cadena
m> pues mi duda es puntualmente:
m> qué es más optimo: hacer un strlen() o usar el sizeof?

Agregando a lo que ha dicho Diego, típicamente no tenemos más remedio que usar 'strlen()', ya que 'sizeof' sólo funciona con lo que sabe o puede deducir el compilador. Por ejemplo,

void func( char cad[] )
{
  cout << "[cad] = " << sizeof cad << "\tstrlen(cad) = " << strlen(cad) << endl;
}

int main()
{
  char szCadena[] = "una cadena";

  func( szCadena );

  return 0;
}

Aparecerá en pantalla:

[cad] = 4       strlen(cad) = 10

Esto es porque 'cad' realmente es un puntero constante y por tanto 'sizeof' retornaría 4 bytes si los punteros son de 32 bits. Mientras tanto, 'strlen()' nos informa de la cantidad de caracteres de la cadena.


Espero que esto vaya aclarando la duda.

Steven


Más información sobre la lista de distribución Cconclase