Newsgroup: it.comp.lang.c
Titolo: Da stringa ad intero: URGENTISSIMO

Salve a tutti.
Ho un problemo e saro' grato a chi vorra' fornirmi un aiuto.
In pratica devo convertire una stringa di caratteri in un numero intero.
La funzione "int atoi(const char*)" esegue la conversione solo se
l'argomento stringa e' una sequenza di numeri. Ad esempio se la sequenza e'
"64146" restituisce 64146, ma se l'argomento e' "Prova" restituisce 0. Ho
bisogno di una funzione che converta la stringa univocamente, qualunque cosa
contenga al suo interno: caratteri o numeri. Ad esempio: input "Prova",
output "123456"; input "Stringa", output "654321" e cosi' via...
Grazie.

output "123456"; input "Stringa", output "654321" e cosi' via...
Cosa intendi per "univocamente"?  Che due qualsiasi stringhe diverse
devono ritornare interi diversi?  Impossibile, come e` facilissimo vedere:
anche limitandosi a stringhe di, putacaso, 10 caratteri, ne esistono molte
di piu` distinte fra di loro, che non esistano interi a 32, o anche a 64 bit.
Se chiarisci meglio le tue specifiche, potremo sicuramente esserti di
maggiore aiuto (qui sul gruppo per favore, NON in mail personale!).
Alex

Grazie.
Prego.
-- 
Warning!
Don't send any mail for me at my from: or replayto: addresses ;
I just kill the mail over there without reading!

Su it.comp.lang.c, il Thu, 10 Sep 1998 12:06:28 +0100, Bisceglia Giovanni scrisse:
BG> Salve a tutti.
BG> Ho un problemo e saro' grato a chi vorra' fornirmi un aiuto.
BG> In pratica devo convertire una stringa di caratteri in un numero intero.
BG> La funzione "int atoi(const char*)" esegue la conversione solo se
BG> l'argomento stringa e' una sequenza di numeri. Ad esempio se la sequenza e'
BG> "64146" restituisce 64146, ma se l'argomento e' "Prova" restituisce 0. Ho
BG> bisogno di una funzione che converta la stringa univocamente, qualunque cosa
BG> contenga al suo interno: caratteri o numeri. Ad esempio: input "Prova",
BG> output "123456"; input "Stringa", output "654321" e cosi' via...
BG> Grazie.
Non so se ho capito bene e se questo può fare al caso tuo:
/* Convert a string to a long integer, with an arbitrary base.
   0nnn -> base 8
   0xnn -> base 16
   Anything else: [base#]number (this is from the ISO Pascal spec). */
static long
strlong (num)
     char *num;
{
  register char *s = num;
  register int c;
  int base = 10;
  long val = 0L;
  if (s == NULL || *s == '\0')
    return 0L;
  if (*s == '0')
    {
      s++;
      if (s == NULL || *s == '\0')
        return 0L;
       /* Base 16? */
      if (*s == 'x' || *s == 'X')
        {
          base = 16;
          s++;
        }
      else
        base = 8;
    }
  for (c = *s++; c; c = *s++)
    {
      if (c == '#')
        {
          base = (int)val;
          /* Illegal base specifications are silently reset to base 10.
             I don't think that this is a good idea? */
          if (base < 2 || base > 36)
            base = 10;
          val = 0L;
        }
      else
        if (isletter(c) || digit(c))
          {
            if (digit(c))
              c = digit_value(c);
            else if (c >= 'a' && c <= 'z')
              c -= 'a' - 10;
            else if (c >= 'A' && c <= 'Z')
              c -= 'A' - 10;
            if (c >= base)
              evalerror ("value too great for base");
            val = (val * base) + c;
          }
        else
          break;
    }
  return (val);
}
Tratto da expr.c (il parser a discesa ricorsiva della shell bash) da
bash-1.14.5.tar.gz.
Ciao
-- 
d@nie`
email:       togli quello che c'è da togliere dall' indirizzo
home page:   
http://www.agora.stm.it/A.Rollo/

input "Stringa", output "654321" e cosi' via...
non capisco a cosa puo' servire, ma forse vuoi solo evitare il
controllo che scarta i caratteri che non sono numeri...
se e' cosi' puoi usare questa..
long miaatoi (char *s)
{
/*dichiarazioni*/
unsigned int posizione;
long moltiplicatore=1;
long numero=0;
unsigned int count;
/*se non devi includere string.h puoi 
anche usare un ciclo while per sapere il numero
di caratteri nella stringa*/
posizione=strlen(s);
/*fino alla fine della stringa*/
while(*s)
{
/*questo considera la posizione della cifra nel numero*/
for (moltiplicatore=1,count=posizione;count>1;count--)
moltiplicatore*=10;
/*questa qui andrebbe scritta cosi':
/*numero+=(*s<48||*s>57)?(0):(*s-48);
/*in modo che le lettere non contassero*/
numero+=(*s-48)*moltiplicatore;
/*passiamo al carattere successivo*/
posizione--;
s++;}
/*restituisce il risultato*/
return(numero);
}
ovviamente quando ci sono lettere nella stringa il numero restirtuito 
non ha senso... ma da quel che ho capito era questo che ti serviva...
approposito, a che cosa ti serviva?
se poi ho capito male spiegami meglio...
per gli esperti di C, vorrei sapere se il codice che ho scritto e'
ottimizzato, oppure si vede che sono un novellino?
(di solito non metto una riga di commento altrimenti si spezzetta  la
funzione e si perde il filo...)
CIAO!