Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mester en 24 Diciembre 2015, 19:02 pm



Título: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 24 Diciembre 2015, 19:02 pm
Hola.

Resulta que he hecho una función que considero bastante útil para el uso popular:
Código
  1. void strssr(const char *arg /*Argumento que contiene los numeros*/,
  2.             char *s /*Puntero a since */,
  3.              char *t /*Puntero a to */,
  4.               uint8_t lim /*Limite de separacion */)
  5. {
  6.   char *str = (char *)arg;
  7.   while(*str)
  8.   {
  9.     *s = *str++;
  10.     if(*str == lim)
  11.       break;
  12.     *s++;
  13.   }
  14.   *str++;
  15.   while(*str)
  16.   {
  17.     *t = *str++;
  18.     *t++;
  19.   }
  20. }

Consiste en separar un argumento en dos a partir de una señal definida en el cuatro argumento, por ejemplo:
Código
  1. int main()
  2. {
  3.   char *ip = (char *)calloc(16,sizeof(char));
  4.   char *puerto = (char *)calloc(5,sizeof(char));
  5.   strssr("192.168.1.1:8080", ip, puerto, ':');
  6.   printf("%s\t%s\n", ip, puerto);
  7. return 0;
  8. }

Me gustaría saber si hay alguien que regule todo esto de las bibliotecas en C. ¿Tal vez el opengroup.org?
Es por el bien de la comunidad jeje.

Gracias por las respuestas.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: ivancea96 en 24 Diciembre 2015, 19:54 pm
Ten en cuenta que existe la función strtok (http://www.cplusplus.com/reference/cstring/strtok/).

A parte, en esa función das por hecho que el segundo y tercer argumento estarán llenos de caracteres nulos.
Además, utilizas como límite uint8_t. ¿Por qué? Son char*, no uint8_t*, tenlo en cuenta.
Luego, ¿qué ocurre si no encuentra el delimitador? Sin comprobar nada, incrementas el puntero, y empiezas a leer memoria que tal vez no te pertenezca.

Hicise la función pensando en el mejor de los casos. Piensa también en el peor de los casos (en cualqueira de ellos).

Las funciones de la librería estándar hacen exactamente lo que dicen. ¿Qué ocurriría si metieras esa función en la librería?

Está bien que quieras compartir tu librería, pero en ese caso, te recomendaría que publicases en, por ejemplo, github.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 24 Diciembre 2015, 20:15 pm
Ten en cuenta que existe la función strtok (http://www.cplusplus.com/reference/cstring/strtok/).

A parte, en esa función das por hecho que el segundo y tercer argumento estarán llenos de caracteres nulos.
Además, utilizas como límite uint8_t. ¿Por qué? Son char*, no uint8_t*, tenlo en cuenta.
Luego, ¿qué ocurre si no encuentra el delimitador? Sin comprobar nada, incrementas el puntero, y empiezas a leer memoria que tal vez no te pertenezca.

Hicise la función pensando en el mejor de los casos. Piensa también en el peor de los casos (en cualqueira de ellos).

Las funciones de la librería estándar hacen exactamente lo que dicen. ¿Qué ocurriría si metieras esa función en la librería?

Está bien que quieras compartir tu librería, pero en ese caso, te recomendaría que publicases en, por ejemplo, github.
Si, ya he visto la función strtok, pero me parece más complicada de usar.

El while(*str) comprueba que str no sea '\0'.
Lo de uint8_t supongo que tienes razón, usaré un char.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: ivancea96 en 24 Diciembre 2015, 20:21 pm
El while(*str) comprueba que str no sea '\0'.

Pero eso no soluciona ninguno de los problemas.

En la línea *str++;. Incrementas sin comprobar si llegaste a un caracter nulo. No sabes si saliste del bucle por caracter nulo, o si saliste por haber encontrado el delimitador.
Y a todo esto, no necesita el *str++.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 24 Diciembre 2015, 20:33 pm
Pero eso no soluciona ninguno de los problemas.

En la línea *str++;. Incrementas sin comprobar si llegaste a un caracter nulo. No sabes si saliste del bucle por caracter nulo, o si saliste por haber encontrado el delimitador.
Y a todo esto, no necesita el *str++.

Si no incremento *str++ la segunda cadena es :8080 en vez de 8080 y si llega a carácter nulo no entrará en el segundo while, es decir, que se queda con la primera cadena.

Código
  1. int strssr(const char *arg /*Argumento que contiene los numeros*/,
  2.             char *s /*Puntero a since */,
  3.              char *t /*Puntero a to */,
  4.               char lim /*Limite de separacion */)
  5. {
  6.   if(s == NULL||t == NULL)
  7.     return 1;
  8.   char *str = (char *)arg;
  9.   while(*str)
  10.   {
  11.     *s = *str++;
  12.     if(*str == lim)
  13.       break;
  14.     *s++;
  15.   }
  16.   *str++;
  17.   while(*str)
  18.   {
  19.     *t = *str++;
  20.     *t++;
  21.   }
  22. return 0;
  23. }

¿Así? Compruebo los argumentos, a excepción de lim, que es cosa del usuario, digo yo.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: ivancea96 en 24 Diciembre 2015, 21:09 pm
¿Qué ocurre si el primer while sale por el conducto ordinario? (*str == 0)
Pues que se acabó la cadena y no s eha encontrado el delimitador.
Sin embargo, ignoras esa posibilidad, incrementas str, y te posiciones fuera de la cadena. Desde ahí, todo lo que hagas, puede dar lugar a error y es inesperado para el programador final.

E insisto, para incrementar un puntero, str++. El * sobra.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 24 Diciembre 2015, 22:04 pm
¿Qué ocurre si el primer while sale por el conducto ordinario? (*str == 0)
Pues que se acabó la cadena y no s eha encontrado el delimitador.
Sin embargo, ignoras esa posibilidad, incrementas str, y te posiciones fuera de la cadena. Desde ahí, todo lo que hagas, puede dar lugar a error y es inesperado para el programador final.

E insisto, para incrementar un puntero, str++. El * sobra.

El compilador no me permite incrementar el puntero con str++. No sé si lo que me dices será en C++.
Y no sé, yo considero que así va bien. Lo pruebo con todas las posibilidades haciendo NULL todo y no devuelve violacion de segmento, para mí esto ya esta xd
El codigo ha quedado así:
Código
  1. int strssr(const char *arg /*Argumento que contiene los numeros*/,
  2.             char *s /*Puntero a since */,
  3.              char *t /*Puntero a to */,
  4.               char lim /*Limite de separacion */)
  5. {
  6.   if(arg == NULL || s == NULL || t == NULL)
  7.     return 1;
  8.   char *str = (char *)arg;
  9.   while(*str)
  10.   {
  11.     *s = *str++;
  12.     if(*str == lim)
  13.       break;
  14.     *s++;
  15.   }
  16.   *str++;
  17.   while(*str)
  18.   {
  19.     *t = *str++;
  20.     *t++;
  21.   }
  22. return 0;
  23. }

¿Alguna recomendación o mejora?

Gracias


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: MAFUS en 25 Diciembre 2015, 01:23 am
Muy buenas.

Pues hay unos cuantos bugs.
Línea 14, 16 y 20: debes cambiar la forma con que haces el incremento. No te interesa el valor que hay guardado en el puntero, solo incrementarlo. Eso es cambiar *var++ por var++.

Por otra parte cuándo la cadena original no tiene separador, el separador es el primer carácter, o hay pocos caracteres en la cadena apuntada por s hay basura en las cadenas s y t.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 25 Diciembre 2015, 01:34 am
Muy buenas.

Pues hay unos cuantos bugs.
Línea 14, 16 y 20: debes cambiar la forma con que haces el incremento. No te interesa el valor que hay guardado en el puntero, solo incrementarlo. Eso es cambiar *var++ por var++.

Por otra parte cuándo la cadena original no tiene separador, el separador es el primer carácter, o hay pocos caracteres en la cadena apuntada por s hay basura en las cadenas s y t.

¿Qué diferencia hay entre *s++ y s++? Creo que en la primera incrementas la posición de la memoria en la que se encuentra *s, pero en la segunda no sé que haces.

¿Que os parece así? :D
Código
  1. int strssr(const char *arg /*Argumento que contiene los numeros*/,
  2.             char *s /*Puntero a since */,
  3.              char *t /*Puntero a to */,
  4.               char lim /*Limite de separacion */)
  5. {
  6.   if(arg == NULL||s == NULL||t==NULL)
  7.     return 1;
  8.   char *str = (char *)arg;
  9.   while(*str && (*s++ = *str) && !(*++str eq lim));
  10.   while(*str && (*t++ = *++str));
  11. }

Más resumido todo.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: MAFUS en 25 Diciembre 2015, 01:47 am
Cuándo a un puntero le antepones el asterisco (*) le estas diciendo al compilador que quieres obtener el valor que guarda.
Para incrementar el valor de la posición apuntada basta usar el operador de incremento (++).
Por eso, como en susodichas líneas no haces uso del valor devuelto por el puntero, algunos compiladores lanzaran alertas informando de ello.


Título: Re: ¿Se puede añadir una funcion a string.h?
Publicado por: mester en 25 Diciembre 2015, 01:55 am
Cuándo a un puntero le antepones el asterisco (*) le estas diciendo al compilador que quieres obtener el valor que guarda.
Para incrementar el valor de la posición apuntada basta usar el operador de incremento (++).
Por eso, como en susodichas líneas no haces uso del valor devuelto por el puntero, algunos compiladores lanzaran alertas informando de ello.
Ah vale, es decir, que al no querer ver el valor de 's', no me hace falta incrementar con *s++. Pensaba que sí jeje.

Gracias MAFUS, otra vez. E ivancea96 a tí también, por tu colaboración. Me habéis sido de gran ayuda.