View Full Version : [C] Aiuto...scrivere una mia versione di itoa()
Free/Sbin
02-07-2006, 19:00
Ciao,
stò impazzendo con l'esame di laboratorio di programmazione...un esercizio è scrivere una propria versione di itoa....questo è il delirio di soluzione messa online dalla proff...che ovviamente non funziona....potete darmi una mano?!?! non capisco proprio la logica dietro all'itoa()....
#include <stdio.h>
#include <string.h>
main()
(
int err=O, n=13;
char s[20];
int itoa(int n,char s[]);
err = itoa(n,s);
s[20]=' ';
\0
printf ("n=%d, s=%s\n",n,s);
}
itoa(n,s)
char s[];
int n;
{
int i, segno;
if((segno = n) < 0) /* controllo segno */
n= -n; /* rende n positivo */
i = 0;
do
{
/* genera le cifre in ordine inverso */
s[i++] = n % 10 + '0'; /* prende la cifra succ.*/
}while(( n/= 10) > 0); /* la toglie */
if (segno < 0)
s[i++] = ' ;
-'
s[i]= ' ';
\0
reverse(s);
return (0);
}
reverse(s) /*inverte la stringa s sul posto */
char s[];
{
int c, i, j ;
for (i = 0, j = strlen(s)-1, i < j; i++, j--)
{
c=s[il;
s[i]=s[j] ;
s[j]=c;
}
}
Vi prego aiutatemi...sono disperato
Ziosilvio
02-07-2006, 20:40
La soluzione sembra copiata dalla prima edizione del Kernighan&Ritchie, per cui mi pare strano che non funzioni.
Le uniche cose che mi danno da pensare sembrano tutte errori di battitura:
- alla riga 4, parentesi tonda aperta che dovrebbe essere graffa aperta;
- alla riga 5, "err=O" che dovrebbe essere "err=0";
- alla riga 10, quel "\0" non ha ragione di essere.
Ora esaminiamo itoa.
Anzitutto, ci si segna da una parte se il numero è negativo, e si lavora sul suo valore assoluto.
Poi, si genera la stringa che rappresenta il numero, ma scrivendo i caratteri in ordine inverso; dopodiché, se il numero era negativo, si aggiungere il carattere '-' in fondo alla riga. (Anche lì, ovviamente, c'è un errore tipografico.) Per cui, a questo punto, se n valeva 15 allora s contiene "51", mentre se n valeva -15, allora s contiene "51-".
A questo punto basta rovesciare s e il gioco è fatto.
repne scasb
02-07-2006, 22:44
#include <stdio.h>
char * __itoa(char *,int,int);
void main(void)
{
char string[(sizeof(int)<<3)+1];
int num,base;
printf("Inserire un numero da convertire: ");
scanf("%19d",&num);
printf("Inserire la base decimale da utilizzare: ");
scanf("%2d",&base);
if(__itoa(string,num,base));
printf("%s\n",string);
}
char * __itoa(string,num,base)
char *string;
int num,base;
{
char tmp_buf[sizeof(int)<<3];
int ex,pos=sizeof(tmp_buf)-1;
char *tmp_string=string;
if((base>36)||(base<2))
return(0);
if(num<0)
{
*string++='-';
num=-num;
}
do
{
ex=num%base;
num/=base;
*(tmp_buf+pos--)=ex<10?ex+'0':ex+'A'-10;
} while (num);
while (++pos!=(sizeof(int)<<3))
*string++=*(tmp_buf+pos);
*string=0x00;
return(tmp_string);
}
è "pericoloso" scrivere cose come *string++ perché lo standard non definisce l'ordine di valutazione degli operatori unari
Free/Sbin
03-07-2006, 09:41
La soluzione sembra copiata dalla prima edizione del Kernighan&Ritchie, per cui mi pare strano che non funzioni.
Le uniche cose che mi danno da pensare sembrano tutte errori di battitura:
- alla riga 4, parentesi tonda aperta che dovrebbe essere graffa aperta;
- alla riga 5, "err=O" che dovrebbe essere "err=0";
- alla riga 10, quel "\0" non ha ragione di essere.
Ora esaminiamo itoa.
Anzitutto, ci si segna da una parte se il numero è negativo, e si lavora sul suo valore assoluto.
Poi, si genera la stringa che rappresenta il numero, ma scrivendo i caratteri in ordine inverso; dopodiché, se il numero era negativo, si aggiungere il carattere '-' in fondo alla riga. (Anche lì, ovviamente, c'è un errore tipografico.) Per cui, a questo punto, se n valeva 15 allora s contiene "51", mentre se n valeva -15, allora s contiene "51-".
A questo punto basta rovesciare s e il gioco è fatto.
Grazie...si effettivamente avevo fatto il copia e incolla fidandomi che la battitura della soluzione non contenesse errori di quel tipo...ora vedo di capire a fondo come funziona itoa()
Domanda stupidissima...ma itoa() in pratica prende un numero e lo mette in una stringa di char?
cioè se gli dò in input il numero intero 345 il 3 lo mette nella prima locazione dell'array, il 4 nella seconda, il 5 nella terza e lo \0 nella quarta? ho capito bene?
trallallero
03-07-2006, 09:49
Domanda stupidissima...ma itoa() in pratica prende un numero e lo mette in una stringa di char?
cioè se gli dò in input il numero intero 345 il 3 lo mette nella prima locazione dell'array, il 4 nella seconda, il 5 nella terza e lo \0 nella quarta? ho capito bene?
esatto
itoa sta per Integer TO Array
Integer TO ArrayInteger TO ASCII ;)
trallallero
03-07-2006, 11:11
Integer TO ASCII ;)
:eekk: é 6 anni che pensavo fosse Array :nera:
:)
Free/Sbin
03-07-2006, 11:41
scusate probabilmente sono stupido io ma non mi entra bene nella testa come itoa fà quello che fà...per favore ditemi se i passaggi che ho capito sono corretti e aiutatemi con quelli che non m'entrano...
in pratica:
/* Riceve l'intero da convertire e il puntatore alla stringa dove mettere la conversione e non ritorna alcun valore */
void itoa(int n, char *s)
{
int i, sign;
if ((sign = n)<0)
//imposta la variabile sign con il valore di n e se il numero è negativo
n = -n; // allora metti in n il suo modulo
i = 0;
do {
s[i++] = n%10 + '0';//in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0?
} while ((n /= 10) > 0); //finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1
if (sign<0) //se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?
s[i++] = '-'; //metti - alla fine (ma il carattere - serve ad indicare nella stringa che il numero è negativo?
s[i] = '\0'; // metti il carattere di fine stringa
reverse(s); // inverti la stringa
}
Temo di aver fatto parecchia confusione...potete aiutarmi un po'?
Grazie
trallallero
03-07-2006, 12:29
// in s[0], s[1],etcetc metti... (che ci mette esattamente)? perchè+0?
ci mette n%10 + '0' che significa il resto della divisione tra n e 10 + '0'
+ '0' provo a spiegarlo:
immagina di voler inserire in una stringa un '1'
Puoi scrivere s[0] = '1' ma anche s[0] = 1 + '0'
perché '0' e '1' sono contigui nella tabella ascii
quindi per comoditá parti da '0' e gli sommi i numeri
che ti arrivano.
Ovviamente do per scontato che tu sappia che '0' e 0 sono diversi
cosí come 1 e '1'. In pratica '1' + 1 = '2' perché sommi
1 al carattere '1'.
In ascii '1' é 49 quindi 49 + 1 = 50 e guarda caso 50 in
ascii corrisponde a '2'
//finchè n!?!?! che condizione è (n /=10)>0 ?!?!?1
corrisonde a:
n = n / 10
n > 0 ?
// se sign <0 ma non lo aveva già fatto questo controllo? o questo è alla fine? perchè lo rifà?
prima ha reso positivo il numero per poterlo convertire (memorizzando in sign il segno)
adesso controlla sign per sapere se deve mettere il carattere '-' nella stringa
comunque bravo! cosí si chiede aiuto ;)
commentando quello che si é fatto (o tentato) e i dubbi.
Ciao :)
Free/Sbin
03-07-2006, 12:39
ci mette n%10 + '0' che significa il resto della divisione tra n e 10 + '0'
+ '0' provo a spiegarlo:
immagina di voler inserire in una stringa un '1'
Puoi scrivere s[0] = '1' ma anche s[0] = 1 + '0'
perché '0' e '1' sono contigui nella tabella ascii
quindi per comoditá parti da '0' e gli sommi i numeri
che ti arrivano.
Ovviamente do per scontato che tu sappia che '0' e 0 sono diversi
cosí come 1 e '1'. In pratica '1' + 1 = '2' perché sommi
1 al carattere '1'.
In ascii '1' é 49 quindi 49 + 1 = 50 e guarda caso 50 in
ascii corrisponde a '2'
corrisonde a:
n = n / 10
n > 0 ?
prima ha reso positivo il numero per poterlo convertire (memorizzando in sign il segno)
adesso controlla sign per sapere se deve mettere il carattere '-' nella stringa
comunque bravo! cosí si chiede aiuto ;)
commentando quello che si é fatto (o tentato) e i dubbi.
Ciao :)
ohh grazie mi hai veramente aiutato moltissimo...ora è tutto più chiaro anche se dovrò rivedermelo più volte prima di farmelo entrare nella testa...si ho abbastanza chiara la storia della tavola ASCII....ora che mi ci hai fatto pensare i ricordi di inizio corso riaffiorano :-P
Cmq quello di commentare riga per riga il codice e chiedere dovew non è chiaro è l'unico modo per capirci qualcosa...cioè se non mi commento anche le banalità le cose non mi entrano in testa...
Scusate se in questo periodo sono stressante ma tra una settimana esatta esame :cry:
Integer TO ASCII ;) veramente che io sappia è Integer TO ANSI... :wtf:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.