elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Se puede añadir una funcion a string.h?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Se puede añadir una funcion a string.h?  (Leído 5,922 veces)
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
¿Se puede añadir una funcion a string.h?
« 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.


« Última modificación: 24 Diciembre 2015, 19:05 pm por nonpromisc » En línea

Justicia es dar a cada uno lo que se merece
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #1 en: 24 Diciembre 2015, 19:54 pm »

Ten en cuenta que existe la función 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.


En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #2 en: 24 Diciembre 2015, 20:15 pm »

Ten en cuenta que existe la función 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.
En línea

Justicia es dar a cada uno lo que se merece
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #3 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++.
« Última modificación: 24 Diciembre 2015, 20:24 pm por ivancea96 » En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #4 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.
« Última modificación: 24 Diciembre 2015, 20:44 pm por nonpromisc » En línea

Justicia es dar a cada uno lo que se merece
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #5 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.
En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #6 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
« Última modificación: 24 Diciembre 2015, 22:13 pm por nonpromisc » En línea

Justicia es dar a cada uno lo que se merece
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #7 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.
En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #8 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.
« Última modificación: 25 Diciembre 2015, 01:56 am por nonpromisc » En línea

Justicia es dar a cada uno lo que se merece
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ¿Se puede añadir una funcion a string.h?
« Respuesta #9 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.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que funcion convierte string a codigo
Programación Visual Basic
mario_2303 9 3,258 Último mensaje 23 Noviembre 2006, 16:18 pm
por Mr.Chispa
Añadir la función buscar a mi web
Desarrollo Web
chocola 3 3,649 Último mensaje 23 Noviembre 2011, 05:11 am
por DarK_FirefoX
Llamar a una función desde un string
Programación C/C++
prometheus48 4 2,843 Último mensaje 25 Mayo 2012, 20:57 pm
por prometheus48
Función Mid de String
.NET (C#, VB.NET, ASP)
Lain0x 4 3,320 Último mensaje 21 Octubre 2012, 21:51 pm
por Lain0x
Añadir un string al final de un fichero en C++
Programación C/C++
seryioo 3 2,503 Último mensaje 22 Febrero 2016, 20:54 pm
por Orubatosu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines