Newsgroup: it.comp.lang.c++
Titolo: Conversione da una stringa esadecimale a un numero

Esempio:
char* S = "FFFF"
come faccio a mettere questa stringa in un numero ?

 come faccio a mettere questa stringa in un numero ?
Probabilmente esiste qualcosa di già pronto, ma comunque non è 
difficile scrivere una funzione di conversione.
Questa non gestisce il segno:
#include <iostream>
#include <cmath>
#include <cctype>
#include <string>
int hex2dec( const std::string& S )
{
  using namespace std;
  int Sl = S.length();
  int res = 0;
  for( int i=0; i<Sl; ++i )
    res += (isdigit(S[i])? S[i]-'0' : S[i]-'A'+ 10) * pow(16,Sl-i-1) ;
  return res;
}
int main()
{
  std::cout << hex2dec("1A2") << std::endl;
}
-- 
Ciao, Marvin
Si sta votando per la creazione di it.cultura.linguistica.francese.
Ulteriori informazioni nella CFV su it.news.annunci


Max

 ha scritto nel messaggio
news:Pine.LNX.4.10.101122...@c64.comm2000.it...

Non c'è neppure bisogno di fare moltiplicazioni, basta usare operazioni bit a
bit.
Ciao  Manlio Perillo

     res += (isdigit(S[i])? S[i]-'0' : S[i]-'A'+ 10) * pow(16,Sl-i-1) ;
non e' portabile, dato che assumi che i caratteri 'A'..'F' siano 
consecutivi tra loro. Un metodo per farlo portabile e' scrivere questa 
funzione:
int hexdigit(char ch)
{
        switch(ch) {
                case 'A': case 'a':
                        return 10;
                case 'B': case 'b':
                        return 11;
                ...
        }
}
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 consecutivi tra loro
Certo, il mitico EBCDIC.
Una curiosità: esistono ancora delle piattaforme che lo usano, o 
comunque nelle quali i caratteri alfabetici non siano consecutivi?
-- 
Ciao, Marvin

 
Non saprei. Comunque nell'EBCDIC i caratteri dalla A alla F *sono*
consecutivi, se non ricordo male.
Max

consecutivi, se non ricordo male.
Ricordi bene.
Sono arrivato (finalmente) a pag 56 ove
 
Esercizio 2-3 pag 56 del K&R
Scrivete la funzione htoi(s), che converte una stringa di cifre
esadecimale (che può comprendere un suffisso opzionale 0x o 0X) nel
suo valore intero corrispondente. Le cifre disponibili vanno da 0 a 9,
da "a" a "f" e da "A" a "F".
/*soluzione 2-3; solo ascii /
#include <stdio.h>
int lower(int c)
{if(c>='A' && c<='Z') return c+'a'-'A'; else return c;}
int isdigit(int c)
{if(c>='0' && c<='9') return 1; else return 0;}
int ispace(int c)
{ if(c==' ' || c=='\t' || c=='\n') return 1; else return 0;}
int htoi(char s[])
{int i=0,n=0;
 while(ispace(s[i])) i++;
 if(s[i]=='0'&& lower(s[i+1])=='x') i+=2;
 for(; isdigit(s[i]) || (lower(s[i])>='a' && lower(s[i])<='f');++i)
         n=16*n+( isdigit(s[i]) ? s[i]-'0' : lower(s[i])-'a'+ 10 );
 return n;
}
 main()
{char b[30];
 int c, ch;
do{printf("\nLista di numeri esadecinmali(1 termina)>");
   do{scanf("%s", &b);
      c=htoi(b);
      printf("\nPartenza=%s\n",b);
      printf("Arrivo  =%d\n",  c);
      if((ch=fgetc(stdin) )=='\n') break;
      else ungetc(ch,stdin);
      } while(ch!=EOF );
 }while(c!=1);
return 0;
}
In quali casi ch==EOF? 
Funzionerà?
Che problemi ci sono per scanf?

On Mon, 24 Dec 2001 12:37:16 GMT, ht...@itoa.itoa (htoi) wrote:
#include <stdio.h>
int lower(int c)
{if(c>='A' && c<='Z') return c+'a'-'A';
 else return c;
}
int isdigit(int c)
{if(c>='0' && c<='9') return 1; else return 0;}
int ispace(int c)
{ if(c==' ' || c=='\t' || c=='\n') return 1; else return 0;}
int htoi0(char s[])
{int i=0,n=0, c , d;
 while(ispace(s[i])) i++;
 if(s[i]=='0'&& lower(s[i+1])=='x') i+=2;
 for(; (c=isdigit(s[i])) || ((d=lower(s[i]))>='a' && d <='f'); ++i )
             n=16*n+( c ? s[i]-'0' : d -'a'+ 10 );
 return n;
}
perchè mi funziona e da il warning:
 Warning W8060 C:\prog\2_7e0.c 18: Possibly incorrect assignment in
function + htoi0
il risultato di (c=isdigit(s[i])) non dovrebbe essere c dopo la
posizione?
Invece
int htoi1(char s[])
{int i=0,n=0, c , d;
 while(ispace(s[i])) i++;
 if(s[i]=='0'&& lower(s[i+1])=='x') i+=2;
 d=lower(s[i]);
 while((c=isdigit(s[i]))==1 || ( d >='a' && d <='f'))
            {n=16*n+( c ? s[i]-'0' : d -'a'+ 10 );
             d=lower(s[++i]);
            }
 return n;
}
non mi da warning :)

 non mi da warning :)
Perchè c'è l'==1 che rende il tutto una espressione booleana.
Domanda: sei sicuro che nel for la sopra non ci dovesse essere un ==1 ?
Io non ho controllato il codice ma se la risposta è si, allora meno male
che ti ha segnalato un potenziale errore visto che l'errore c'è
veramente (e che è proprio un assegnamento in una espressione che
avrebbe dovuto essere un'operator==).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

posizione?
Caro htoi, 
stai tranquillo anche nel K&R2 vi è qualcosa di simile a
/*strcpy: copia t in s ritorna s*/
char* strcpy(char* s, char* t) 
{char * p=s;
 while(*s++=*t++);
 return p;
}
che utilizza la stessa proprietà nel while(*s++=*t++);
il warning sarà stato messo perché il più delle volte c'é == invece
che =.
Vi piace la mia reverse?
char* reverse(char* s)
{char * p=s, * p1=s, * p2, c;
 if(*s=='\0') return p;
 while(*++s);
 for(p2=--s; p1 < p2 ; p1++ , p2--)
       {c=*p1; *p1=*p2; *p2=c;}
 return p;
}

 }
E siccome sono pigro non ho neanche controllato se funziona davvero, ne
se sia possibile usare solo due puntatori, anche col vincolo di
ritornare s.
Ciao,
Nicola

 Se fai il capovolgimento sul posto, che senso ha restituire un valore?
Lo stesso senso, immagino, che ha nella maggior parte delle funzioni
str... (vedi l'include <cstring>) -- permettere un minimo di
compattezza in piu`, e.g.
    strcat(reverse(buf),"boh");
Non mi entusiasma, comunque e` molto diffuso.  Sarebbe forse meglio
chiamare di conseguenza la funzione strrev o simili (nel vecchio ISO
C 89/90 non si sarebbe potuto, ma in ISO C++ ovviamente si`, basta,
altrettanto ovviamente, lasciare in pace il namespace std).
D'altronde continuare a usare le pessime convenzioni del C, a
partire dall'"array di caratteri terminati da 0", non e` certo
segno di buona programmazione C++.  Grazie al fatto che strcat
ritorna l'*inizio* della stringa, ad esempio, in C mettere
insieme una stringa grande in un buffer concatenando tante
piccole con strcat finisce per essere un'operazione O(N**2)
se si usano le funzioni standard -- che assurdita`.
Alex

ritornare s.
probabilmente sě, ma lo spreco di un puntatore per chiamata č grave?
Ciao da
        qwerty

 probabilmente sì, ma lo spreco di un puntatore per chiamata è grave?
In genere probabilmente no, ma cio sono almeno due eccezioni: in codice
di basso livello come il tuo gli sprechi evidenti vanno assolutamente
evitati e quando si posta del codice per vantarsi dev'essere quanto meno
perfetto ;-)
Ciao,
Nicola