PDA

View Full Version : [C] Programma in C simile all'ATOI


cecce88
28-05-2008, 11:26
Questo programma dovrebbe svolgere una funzione simile all'ATOI, quindi prende un stringa di numeri e la trasforma in intero! Il fatto è che non accetta la stringa, mi da errore come se leggesse dei caratteri! Sapete aiutarmi?

#include<stdio.h>
int potenza(int);

int main()
{ char s[101],c;
int i=0,in=0,j,p,aux,end;

/*Inserimento stringa*/
printf("Inserisci stringa: ");
while((c=getchar()!='\n')||(i<100))
{ if ((c>=48)&&(c<=57)||(c==' '))
{ s[i]=c;
i++;
}
else
{ printf("Inserito carattere errato!! esci");
return 0;
}
}
s[i]='\0';
end=i;

/* eliminazione spazi vuoti */
for(i=0;i<end;i++)
{ if(s[i]==' ')
{ for(j=i;j<end;j++)
s[j]=s[j+1];
}
}

/*trasformazione intero*/
for(i=0;i<end;i++,end--)
{ aux=s[i];
s[i]=end;
s[end]=aux;
}

for(i=0;i<end;i++)
{ p=potenza(i);
in=in+((s[i]-48)*p);
}

printf("\n L'intero è: %d", in);
return 0;
}

int potenza(int x)
{ int y,pot=1;
if(x==0) return pot;
for(y=1;y<=x;y++)
pot=pot*10;
}

ilsensine
28-05-2008, 11:33
Sicuramente questo è sbagliato:

for(i=0;i<end;i++,end--)
{ aux=s[i];
s[i]=end;
s[end]=aux;
}

Presumo vuoi invertire le cifre, ma questo codice è scorretto.
Ad es. questo credo è quello che vuoi fare:

for(i=0;i<end/2;i++) {
aux=s[i];
s[i]=s[end-i-1];
s[end-i-1]=aux;
}


Poi, perché leggi gli spazi se poi devi saltarli? Ignorali direttamente in fase di lettura, no?

cecce88
28-05-2008, 11:37
il problema non me lo da lì!! Ma nel primo for alla IF..io ho messo il controllo c>=48 e <=57 (in ASCII da 0 a 9)!! Solamente che quando vado in esecuzione e metti dei numeri questo mi da errore come se avessi inserito de caratteri!!

ilsensine
28-05-2008, 11:40
Il problema è qui:

(c=getchar()!='\n')

infatti il mio compilatore mi segnala correttamente un warning.
Hai idea di cosa possa esserci di sbagliato? ;)

cecce88
28-05-2008, 11:54
while((c!='\n')||(i<100))
{ c=getchar();
if ((c>=48)&&(c<=57))
{ s[i]=c;
i++;
}
else
if (c!='\n')
{ printf("Inserito carattere errato!! esci");
return 0;
}
}

Ho corretto in questo modo! Solamente che se dopo l'inserimento dei caratteri di l'INVIO dovrebbe uscir dal ciclo (c!='\n')!!! Invece non lo fa! Devo inserire tutti a 100 i caratteri! :(

gepeppe
28-05-2008, 14:04
while((c!='\n')||(i<100))
{
c=getchar();
if ((c>=48)&&(c<=57))
{ s[i]=c;
i++;
}
else
if (c!='\n')
{ printf("Inserito carattere errato!! esci");
return 0;
}
}

Ho corretto in questo modo! Solamente che se dopo l'inserimento dei caratteri di l'INVIO dovrebbe uscir dal ciclo (c!='\n')!!! Invece non lo fa! Devo inserire tutti a 100 i caratteri! :(

cosi già si capisce di più. Cmq ci vuole l'and e non l'or, perchè deve continuare il ciclo while mentre c è diverso dall'invio ed i < 100. Appena una delle due condizione risulta non verificata, esce dal ciclo.