Newsgroup: it.comp.lang.c
Titolo: [atoi] ASSURDO !

Quello che mi sta capitando è veramente assurdo, almeno per me...
Utilizzo la funzione ATOI per trasformare una stringa in un intero.
Visto che provando con stringhe vere e proprie avevo avuto problemi, ho
provato ad utilizzare un array di un carattere (cioè un carattere, non
chiedetemi perchè l'ho fatto, sono quasi le 2 di notte...), riempirlo con
una cifra da 0 a 9 e convertirlo con l' atoi, in questa maniera:
char c[1];
  c[0]=Buffer[20]; // Buffer è una stringa che ottengo leggendo una riga di
file di testo, Buffer[20] è il carattere 1 (uno);
  cIntero=atoi(c);
il Problema?
Il valora di cIntero è 11 (undici) e non 1 come dovrebbe essere!!!
Ah... se scrivo:
c[0]='1';
  cIntero=atoi(c);
... stessa cosa!!!
Allora, ma che cavolo sbaglio???
Ho paura che il compilatore sia bacato ( l'ultima versione del Borland C++
Builder 5, trial). Infatti prima di convertire semplicemente un carattere,
avevo provato a convertire un intera stringa: la cosa stranissima è che le
stesse righe di codice funzionavano per la prima stringa che convertivo, ma
la seconda risulta errata, proprio come nel caso esposto sopra! E' una cosa
ridicola, ma non sto scherzando: mi è venuto il sospetto che atoi vada
avanti a "cercare" in memoria senza fermarsi alla fine della stringa. Così,
se incontra una cifra in memoria invece di un "carattere non riconosciuto",
lo somma alle cifre che effettivamente compongono la stringa
AIUTO!!!!!!
Suggerimenti?
Grazie!
Nick

 atoi vada avanti a "cercare" in memoria senza fermarsi alla fine della
stringa.
bingo! mai sentito parlare di stringhe null-terminated? ;))
char c[2];
c[0] = '1';
c[1] = '\0'; /* !!!!! */

   cIntero=atoi(c);
Vedrai che adesso funziona.
Il perche' lo lascio intuire a te.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 char c[] = "1" ;
Ciao grazie mille per la risposta ad entrambi!
Allora, l'utilizzo del terminatore lo avevo provato su un altro pezzo di
codice, ma ottenevo sempre un errore simile, per cui l'avevo abbandonato,
anche perchè altre procedure dello stesso programma che convertivano con
atoi delle stringhe SENZA terminatore andavano a buon fine.
Ad ogni modo ho riprovato ed effettivamente la parte di programma che avevo
postato ora funziona.
Ora vi chiedo ancora questo: mi spiegate perchè la prima parte del codice
che scrivo sotto funziona correttamente, mentre la seconda, identica, no?
----------- Prima parte funziona-------------------------------------
char *g,*m,*a,*end;
char giorno[3],mese[3],anno[5]; //Stringhe che conterranno giorno,mese e
anno (da convertire con atoi in interi)
int IntGiorno,IntMese, IntAnno; //Giorno,mese e anno convertiti in interi
int j,k,z;
g=Buffer;  // Buffer è un parametro della procedura dichiarato come: char
Buffer[180]
g=g+17;
m=Buffer;
m=m+20;
a=Buffer;
a=a+23;
for (j=0;j<2;j++)
    { g=g+j;
    giorno[j]=*(g);
    }
giorno[2]='\0';
IntGiorno=atoi(giorno);
for (j=0;j<2;j++)
  {m=m+j;
    mese[j]=*(m);
   }
 mese[2]='\0';
IntMese=atoi(mese);
------------Fine prima parte *Funzionante* ------------------
-----------Inizio Seconda parte, stessa funzione, ma NON
funzionante ---------------
for (k=0;k<4;k++)
  {a=a+k;
    anno[k]=*(a);
   }
anno[4]='\0';
IntAnno=atoi(anno);
----------------------Fine Seconda parte, stessa funzione, ma NON
funzionante ----------------
I risultati della procedura sono questi:
Giorno da legger dal buffer = '17'
Stringa ottenuta "Giorno"= 17
IntGiorno = 17 ---> OK
Mese da leggere dal buffer= '11'
Stringa ottenuta Mese= 11
IntMese=11 --> OK
Anno da Leggere dal buffer='1234'
Stringa Ottenuta = '111d' <------ Sbagliato!!!
IntAnni = '134' <---Sbagliato!!!!
Come diavolo è possibile!?! Quello che ho notato è che IntAnni è, in
pratica, formato dalla prima cifra del buffer da leggere, dalla seconda e
dalla quarta, ma la terza viene saltata! Cioè, se volessi leggere la stringa
'1235' otterrei come intero 125, se la stringa fosse '1238' otterrei 128!
Inoltre, la stringa ottenuta con il ciclo for la visualizza sempre con 111d,
indipendetemente da quello che effettivamente viene letto. Cioè sia che la
stringa del buffer sia '1234', sia che sia '4322' o che altro, la stringa
ottenuta è sempre 111d.
Non capisco più nulla, aiutatemi!
Grazie mille!

I risultati della procedura sono questi:
Il problema nell'esempio non funzionante e' sapere quanto
vale a prima del ciclo.
-- 
The Follet

 vale a prima del ciclo.
A quale valore ti riferisci? Ad ogni modo mi sembra davvero molto strano che
atoi converta la prima, la seconda e la quarta cifra ignorando la terza
(qualsiasi essa sia).
Grazie e ciao!
Nick

(qualsiasi essa sia).
atoi() converte sequenze di cifre terminate dal carattere
nullo, punto e basta.  Se gli effetti del suo uso appaiono
*strani* e' perche' e' strano il modo in cui la si usa.
-- 
The Follet

 *strani* e' perche' e' strano il modo in cui la si usa.
Sinceramente mi sembra di averlo utilizzato correttamente, la stringa l'ho
terminata.
Se puoi, aiutami a capire dove è l'errore, per piacere.
Grazie ancora.
Ciao!
Nick