[C con Clase] ¿Que es mas recomendable ? (punteros)

David A. Capello davidcapello en gmail.com
Sab Nov 25 14:18:20 CET 2006


Sí, es legal que un puntero esté fuera de su rango
siempre y cuando no hagas referencia al valor que
apunta. Ej. El siguiente código es completamente
legal:

#include <iostream>

int main()
{
   char *p = "Hola";
   p--;

   // ... <-- Si hacemos *p ahora, eso es un acceso ilegal a memoria

   std::cout << *++p;
   std::cout << *++p;
   std::cout << *++p;
   std::cout << *++p;
}

La STL hace algo parecido con los iteradores.
{
   basic_string<char> s;
   s.push_back('H');
   s.push_back('o');
   s.push_back('l');
   s.push_back('a');
   cout << s << endl;
   int c = 0;
   for (basic_string<char>::reverse_iterator it = s.rbegin(); it !=  
s.rend(); ++it) {
     *it = '0'+c++;
   }
   cout << s << endl;
}

Da como resultado:

   Hola
   3210

Lo que es lo mismo que:
{
   char *s = new char[5];
   s[0] = 'H';
   s[1] = 'o';
   s[2] = 'l';
   s[3] = 'a';
   s[4] = 0;
   cout << s << endl;
   int c = 0;
   for (char *it = s+strlen(s)-1; it != s-1; --it) {
     *it = '0'+c++;
   }
   cout << s << endl;
}

Fijate como el puntero "it" queda en la posición "s-1" (que
no es accesible), al igual que un iterador STL en el posición
"rend()" (la cual tampoco es accesible).

Finalmente, acá te doy otras alternativas a tu código:
...
{
   int nPosicion = 0;
   while (*pCadena != 0) {
     if (*pCadena++ == cbCaracter)
       return nPosicion;
     nPosicion++;
   }
   return -1;
}
...
{
   return strchr(pCadena, cbCaracter);
}
...
{
   char *p = pCadena;
   while (*p != 0 && *p != cbCaracter) ++p;
   return *p != 0 ? p - pCadena: -1;
}

P/D: Parece ser que estás devolviendo 1 si está en la primera posición,
      en ese caso, deberías sumarle uno a todas las alternativas que
      te dí.

-- 
http://www.davidcapello.com.ar/

On Mon, 20 Nov 2006 18:37:54 -0300, rodolfo rosso paz  
<rodolforossopaz en hotmail.com> wrote:
> Hola a todos, gracias por atender mis consultas, quisiera saber si
> cualquiera de estas dos opciones
> es válida o si una es preferible a la otra, las he probado y las dos
> funcionan, pero a lo mejor
> una no es muy correcta, por estar manipulando posiciones de memoria con
> datos desconocidos.
>
> /* Funcion : BuscaCaracter
>     Recibe un puntero a char y un char
>     devuelve la posision de encuentro o -1 si no encuentra */
>
> int BuscaCaracter(char* pCadena, char cbCaracter)
> {
>     int nPosicion = 1;
>
>     // ¿ que es mejor ? ¿esto?
>     while(*pCadena   &&   *pCadena++  !=  cbCaracter)   nPosicion++;
>     return((*pCadena   ||   *(pCadena-1) == cbCaracter) ?  nPosicion  :
> -1);
>
>     // ¿o esto?  ¿ es valido retroceder una mas del limite de pCadena,
> mientras no le vaya a
>                         hacer ninguna modificación, o no es lícito  ?
>     pCadena--;
>     while(*++pCadena && *pCadena != cbCaracter) nPosicion++;
>     return(*pCadena ? nPosicion : -1);
> }





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