Cześć!
Właśnie robię kalkulator z wieloma opcjami i poszukuję efektywnego sposobu zamiany char na int. Robiłem to za pomocą funkcji atoi jednak zwraca ona wartość 0, dla każdego znaku, co powoduje problem przy wybraniu niewłaściwej opcji i wrzuca na stos 0. Język C.
Z góry dzięki za odp.
Zapoznaj się z funkcją isdigit
.
Jeżeli ''atoi'' zwraca zero to znaczy, że nie można było dokonać konwersji, co w najbardziej zwyczajnym przapadku oznacza, że przekazujesz do niej znaki inne niż te reprezentujące cyfry.
Niestety funkcja isdigit czyta tylko pojedynczą cyfrę i gubi się przy większych liczbach. Na zajęciach mieliśmy taki oto kod:
int liczba;
char wybor;
wybor=getc(stdin);
if(wybor in['1''2'....'9']);
ungetc(wybor, stdin);
scanf("%d", liczba);
printf("%d", liczba);
Jednak kompilator wyrzuca mi błąd: line 10: syntax error before or at: in
To powinno pomóc.
#include <iostream>
#include <string>
int to_digit(char c) {
if(c >= '0' && c <= '9') {
return c-'0';
}
std::cerr << "[" << c << "] TO NIE CYFRA!11!!" << std::endl;
return 0;
}
int to_number(std::string const &str) {
try {
return std::stoi(str);
} catch(...) {}
std::cerr << "[" << str << "] TO NIE LICZBA!11!!" << std::endl;
return 0;
}
int main() {
using namespace std;
cout << to_digit('9') << endl;
cout << to_digit('@') << endl;
cout << to_number("-123") << endl;
cout << to_number("-kappa") << endl;
return 0;
}
http://ideone.com/SMRYVN
stdout
9
0
-123
0
stderr
[@] TO NIE CYFRA!11!!
[-kappa] TO NIE LICZBA!11!!
edit: to Ci nie pomoże w C; Fajnie byłoby, gdybyś w tagach albo w tekście wspomniał o języku, bo magiczna kula nie zawsze działa
Programujemy w C, z rozpędu wpadając w dział c i c++ zapomniałem dopisać, sorry.
Zapoznaj się z funkcją: strtol
.
Jakie liczby obsługuje twój kalkulator? Jakie liczby uważasz za poprawne?
wybor=getc(stdin);
if(wybor=='0' ||wybor=='1' || wybor=='2' || wybor=='3' || wybor=='4' || wybor=='5' || wybor=='6' || wybor=='7' ||
wybor=='8' || wybor=='9'){
ungetc(wybor,stdin);
scanf("%d", &liczba);
push(&stos,liczba);
}
else{
switch(wybor)
Zrobiłem takie coś. Wszystko działa tak jak chciałem, wpisuję nawet kilku cyfrowe liczby i są one wrzucane na stos. Teraz jest tylko jeden problem przy liczbach ujemnych. Co najlepiej zrobić, aby program był w stanie je wykryć? Bo wpisując np -33 pierw odejmuje dwie pierwsze liczby ze stosu, a następnie dodaje na stos liczbę 33.
Spróbuj coś takiego:
int a2i(const char *s)
{
int sign=1;
if(*s == '-')
sign = -1;
s++;
int num=0;
while(*s)
{
num=((*s)-'0')+num*10;
s++;
}
return num*sign;
}
Wzięte z: http://stackoverflow.com/questions/13145777/c-char-to-int-conversion