Newsgroup: it.comp.lang.c++
Titolo: Da codice ASCII a carattere corrispondente

Salve, ho un array di char, pieno di 0. Tale valore devo usarlo in un ciclo
for come indice, ma naturalmente mi restituisce il suo corrispondente in
ASCII, cioč 48. C'č una funzione che converte da ASCII al valore che
interessa a me? Grazie per le eventuali risposte, bye

 ha scritto nel messaggio
news:ohIZ7.31662$s04.1...@news.infostrada.it...

int ottieni_numero(char c)
{
    return c - '0';
}
ovviamente non funziona se c non č una cifra compresa tra 0 e 9...
Marco

 ovviamente non funziona se c non è una cifra compresa tra 0 e 9...
In più non è portabile. Ma questo forse non importa molto.
--
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


Hai ragione, non č portabile. Del resto, se volessimo una soluzione
portabile, si potrebbe usare uno stringstream come intermediario tra stringa
e valore numerico. Certo, per una sequenza di singoli caratteri diventa
piuttosto pesantuccio....
int ottieni_numero(char c)
{
    std::istringstream iss(std::string(1, c));
    int n;
    iss >> n;
    return n;
}
    Marco

In più non è portabile. Ma questo forse non importa molto.
e in quali macchine non funziona nel caso trattato delle cifre?
In ASCII  e in EBCDIC dovrebbe essere ok

 In ASCII  e in EBCDIC dovrebbe essere ok
Non funziona sulle macchine in cui i caratteri '0', '1', ..., '9' non sono
consecutivi. Il fatto che sia "logico" codificarli in posizioni adiacenti e
secondo la relazione d'ordine che noi conosciamo, non vuol dire che sia
obbligatorio: ci può essere un computer in cui questa condizione non vale.
Non serve sapere se in effetti un tale elaboratore esiste, basta sapere (per
chi vuole rendere portabile il proprio codice) che la condizione d'ordine
sui codici delle cifre numeriche non è garantita da nessuno.
Marco

"tipi" <ti...@tipi.tipi> wrote in message
news:3c3ad03c...@news.tin.it...

Portabile non significa che funziona su macchine ASCII ed EBCDIC.
Significa che funziona su qualunque macchina e con qualunque sistema di
codifica. Anche uno proprietario e appositamente inventato per quella
specifica macchina.


ovviamente non funziona se c non è una cifra compresa tra 0 e 9...
e queste? 
int ottieni_numero1(char c)
{char x[]="0123456789";
 int i;
 for(i=0; i<=9; ++i)
    if(x[i]==c) return i;
 return -1;
}
int ottieni_numero2(char c)
{switch(c){
                 case '0': return 0;
                 case '1': return 1;
                 case '2': return 2;
                 case '3': return 3;
                 case '4': return 4;
                 case '5': return 5;
                 case '6': return 6;
                 case '7': return 7;
                 case '8': return 8;
                 case '9': return 9;
                }
 return -1;
}
_________________________________
#define numero(n) switch(n){\
                  case '0':  n=0; break;\
                  case '1':  n=1; break;\
                  case '2':  n=2; break;\
                  case '3':  n=3; break;\
                  case '4':  n=4; break;\
                  case '5':  n=5; break;\
                  case '6':  n=6; break;\
                  case '7':  n=7; break;\
                  case '8':  n=8; break;\
                  case '9':  n=9; break;\
                  default :  n=-1;}

 In piů non č portabile. Ma questo forse non importa molto.
invece e` portabile. Dal K&R:
"Il valore numerico di quella cifra e` c-'0'. Questo vale soltanto se 
'0', '1', ..., '9' possiedono valori crescenti e consecutivi. 
Fortunatamente cio` e` vero per tutti i set di caratteri".
Tempo fa c'e` stata una discussione al riguardo su it.comp.lang.c e chi 
possedeva lo Standard C aveva anche trovato il paragrafo in cui veniva 
assicurato cio`. Dubito che lo Standard C++ abbia cambiato qualcosa 
sotto questo punto di vista.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 sotto questo punto di vista.
Io dubito che lo standard C++ lo richieda. Il set di caratteri (anzi I
set di caratteri dato che si distingue il set compile time dal set usato
per le stringhe dai set utilizzabili a runtime) sono "implementation
defined".
Riguardo al C ... non saprei. Sarei curioso di leggere il paragrafo in
cui si dice che il set di caratteri runtime lo richiede. Ma è possibile
(per il vecchio C almeno, forse le cose sono cambiate con l'ultimo
standard C) dato che ammetteva un solo set di caratteri runtime che
doveva essere contenuto per forza in un byte per carattere. Il C++
ammette set di caratteri multipli e fra quelli supportati potrebbero
esserci anche caratteri composti da più di un byte.


Io dubito che lo standard C++ lo richieda.
Mi pare che sullo Stroustrup venga assicurato che i caratteri che
rappresentano i numeri sono consecutivi, ma non so come cercarlo.
-- 
Marco Barisione (ICQ 84277092)

 Tutti? Io ne ho appena definito uno proprietario in cui non č cosě!
puo` darsi che con quel set di caratteri non sia possibile realizzare un 
compilatore standard...
tra l'altro sul K&R viene spesso fatto il discorso sulla portabilita`: 
si spiega chiaramente che non e` detto che le lettere siano consecutive 
e non parla mai di "codice ASCII del carattere" ma di "codice numerico 
relativo al set di caratteri del sistema". Il fatto che abbiamo deciso 
di scrivere una frase cosi` forte "...tutti i set di caratteri" mi fa 
pensare che la abbiano scritta coscientemente. Ma e` solo una 
supposizione, ovviamente.
Ripeto, non sono sicuro al 100% e non sono neppure sicuro che faccia 
parte anche dello standard C++. Pero` ne sono ragionevolmente convinto 
;-)
