[C] Convertir string a int

zildjian

Hola MVeros, mi pregunta es clara y sencilla. ¿Cómo puedo pasar un string a un int? Es porque necesito implementar una hash table, y por ahí he visto la funcion 'atoi' incluida en la librería stdlib.h , pero por lo que veo es para C++. También vale este comando para C o hay otro?

Gracias por adelantado! ^,

ArcheR

atoi funciona perfectamente en C. También tienes otras variantes como atol (pasar a long) o atof (pasar a double).

zildjian

Muchas gracias! o

dagavi

Sin contar que si hablas de hashtables no te debería costar nada realizar una función
"int convertir(string s);"

EtherMaN

http://karman.homelinux.net/blog/descargas/302916840_d59b65937a.jpg

Soltrac

#5 xDDDDD, aunque no entiendo el pq de aplicarlo a este caso :P

JuAn4k4

Para hacer una tabla hash hay otros metodos en lugar de ATOI, además si quieres pasar texto a numero depende de como sea el texto, te dara overflow y plas!

Esta si esta en C ( Horner , funciona bien pero no es de lo mas rapido)

inthash_horner(char* s, int M)
{
int h, a = 256;
for(h=0; *s != ’\0’; s++) 
 h = (a*h + *s) % M;
return h;
}
zildjian

#7 Gracias por la función pero no la puedo utilizar, pues la que tengo que implementar se basa en la aritmética modular, así que no tengo por qué preocuparme si me saldrá un número muy bestia porque lo indexará dentro del límite prefijado que tiene la HashTable.

JuAn4k4

#8 Claro pero una de las historias de las tablas hash, es que la funcion de hash genere una buena dispersion en los datos, cosa que el atoi no creo que haga muy bien.

De todas formas, si haces el modulo "post" atoi, el atoi petara antes.

Es algo asi como :

imaginate que la variable s = "Este texto va a generar un overflow"

atoi(s) hace pum! por mucho que yo le diga : indice = atoi(s) % M ;

El atoi te servira para cadenas pues.. no muy grandes, y la vdd es que no se muy bien que hara el atoi con esa cadena ejemplo "s" reduciendola a "Este".

Imagino que hara algo asi como
((int)'E' - (int)'0') * 1000 + ((int)'s' - (int))'0' *100 , etc..

LOc0

#9

atoi() no puede usarla así ya que devuelve siempre cero si se le meten cadenas que no sean numéricas puras. http://en.wikipedia.org/wiki/Atoi

Imagino que la querrá para otra cosa como sacar los argumentos del main()...

Salu2 ;)

zildjian

O sea, que la cadena tiene que ser de números? :O Yo lo que quiero hacer es pasar el nombre de una función por la operación mod83 . Entonces, cómo se declararía bien?

LOc0

Pues entonces usa lo de #7 o invéntate una función. (Lo de Juan4k4 tiene retroalimentación y se supone que tiene buenas propiedades de dispersión ya que si cambias una letra de la cadena afecta a todas las que estén a su derecha).

Salu2 ;)

Pd: una posible función:


hash(char *cadena, int modulo)
{
   int hash=0;

   while(*cadena)
      hash+=*cadena++;

   return hash%modulo;
}

//Llamada hash("caca", 83);

Nota que esta función de hash es bastante mala, ya que por ejemplo las palabras ROMA y AMOR tendrían el mismo hash¬¬...

JuAn4k4

#11 Usa la de #7 que la invento un tio que sabe mucho de matematicas, y no creo que sepamos inventar nada mejor y más rapido.

Si es para un compilador o nombres de funciones y quieres velocidad, puedes usar la mas sencilla de todas, que es :

Multiplicar el valor entero del primer y ultimo caracter de la cadena % M.

Si miras en tu codigo veras, los identificadores estilo

_xxxx1
_xxxx2
_xxxx3

yyyy;
yyyy1;
yyyy2;

etc, yo suelo hacer eso, por lo que ese hash viene bastante bien, para todo lo demas, la que te puse antes.

Usuarios habituales

  • JuAn4k4
  • LOc0
  • zildjian
  • Soltrac
  • EtherMaN
  • dagavi
  • ArcheR