Ĺadny brzuch
Wykonałem program, który swym działaniem przypomina funkcję IntToStr, wszystko jest dobrze w kodzie, kompilacja przebiega bez błędów, no ale program nie działa :P :D
#include <iostream> #include <conio.h> #include <string> using namespace std; string IntToStr(int lic) { int dz = 1; string inttostr = ""; while((dz * 10) <= lic) { dz*=10; } while(dz != 0) { inttostr += char((lic / dz)+48); lic %= dz; dz /= 10; } return inttostr; } int main() { int liczba; cin >> liczba; cout << IntToStr(liczba) << [i][u]endl[/u][/i]; getch(); return 0; }
Jak widać program kolejne cyfry zamienia na znaki i wstawia do inttostr, pózniej drukuje wynik w postaci znaków, tylko że zamiast tego widzę w konsoli zdanie:
Abnormal program termination :blink:
Wydaje mi się że to wina kompilatora(borland C++ builder 5.01). Co o tym sądzicie??
Użytkownik ToNieJa edytował ten post 27 kwiecień 2006, 12:20
#include <iostream> #include <string> using namespace std; string inttostr(int x) { string st = ""; while (x>0) { st=(char)(x%10+48)+st; x/=10; } return st; } int main() { int in; cin >> in; cout << inttostr(in) << endl; system("pause"); return 0; }
char *itoa(int i) { static char buf[19 + 2]; char *p = buf + 19 + 1; if (i >= 0) { do { *--p = '0' + (i % 10); i /= 10; } while (i != 0); return p; } else { do { *--p = '0' - (i % 10); i /= 10; } while (i != 0); *--p = '-'; } return p; }
Dzięki Cyrkiel , twój kod działa :) ,ale mam jeszcze jedno pytanie:
Rozumiem że to nie wina kopilatora, więc dlaczego mój program nie działa (nie chciałbym używać kodu bez zrozumienia)?
Chodzi mi głównie o to przypisanie:
inttostr[i] = char((lic / dz)+48);
czy coś tu jest źle (a może gdzieś indziej coś zawaliłem :huh: )?
Powinno byćinttostr += (lic / dz)+48;bo string inttostr na początku ma długość 0, a Ty odwołujesz się do kojejnych praktycznie nieistniejących znaków :)
Ja bym jednak polecał byś zastosował mój kod, bo poprawnie obsługuje on liczby ujemne, a poza tym jest szybszy, chociaż to akurat w większości wypadków może nie ma takiego znaczenia.
Powinno byćinttostr += (lic / dz)+48;bo string inttostr na początku ma długość 0, a Ty odwołujesz się do kojejnych praktycznie nieistniejących znaków :)
To dodaj chociaż obsługę liczb ujemnych. Bardzo łatwo możesz to zrobić przerabiając kod Cyrkla, tak że jeśli liczba jest ujemna to na początku st = "-", a jeśli dodatnia to tak jak teraz "".
A co do rzekomego nie działania dopóki nie dałeś endl to zapewne działało, ale po prostu znaki nie były wyprowadzone z bufora na ekran.
Użytkownik Chmurek edytował ten post 27 kwiecień 2006, 13:36
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <iostream> #include <conio.h> #include <string> using namespace std; string IntToStr(int lic) { int dz = 1; string inttostr = ""; while((dz * 10) <= lic) { dz*=10; } while(dz != 0) { inttostr += char((lic / dz)+48); lic %= dz; dz /= 10; } return inttostr; } int main() { int liczba; cin >> liczba; cout << IntToStr(liczba) << [i][u]endl[/u][/i]; getch(); return 0; }
Jak widać program kolejne cyfry zamienia na znaki i wstawia do inttostr, pózniej drukuje wynik w postaci znaków, tylko że zamiast tego widzę w konsoli zdanie:
Abnormal program termination :blink:
Wydaje mi się że to wina kompilatora(borland C++ builder 5.01). Co o tym sądzicie??
Użytkownik ToNieJa edytował ten post 27 kwiecień 2006, 12:20
#include <iostream> #include <string> using namespace std; string inttostr(int x) { string st = ""; while (x>0) { st=(char)(x%10+48)+st; x/=10; } return st; } int main() { int in; cin >> in; cout << inttostr(in) << endl; system("pause"); return 0; }
char *itoa(int i) { static char buf[19 + 2]; char *p = buf + 19 + 1; if (i >= 0) { do { *--p = '0' + (i % 10); i /= 10; } while (i != 0); return p; } else { do { *--p = '0' - (i % 10); i /= 10; } while (i != 0); *--p = '-'; } return p; }
Dzięki Cyrkiel , twój kod działa :) ,ale mam jeszcze jedno pytanie:
Rozumiem że to nie wina kopilatora, więc dlaczego mój program nie działa (nie chciałbym używać kodu bez zrozumienia)?
Chodzi mi głównie o to przypisanie:
inttostr[i] = char((lic / dz)+48);
czy coś tu jest źle (a może gdzieś indziej coś zawaliłem :huh: )?
Powinno byćinttostr += (lic / dz)+48;bo string inttostr na początku ma długość 0, a Ty odwołujesz się do kojejnych praktycznie nieistniejących znaków :)
Ja bym jednak polecał byś zastosował mój kod, bo poprawnie obsługuje on liczby ujemne, a poza tym jest szybszy, chociaż to akurat w większości wypadków może nie ma takiego znaczenia.
Powinno byćinttostr += (lic / dz)+48;bo string inttostr na początku ma długość 0, a Ty odwołujesz się do kojejnych praktycznie nieistniejących znaków :)

To dodaj chociaż obsługę liczb ujemnych. Bardzo łatwo możesz to zrobić przerabiając kod Cyrkla, tak że jeśli liczba jest ujemna to na początku st = "-", a jeśli dodatnia to tak jak teraz "".
A co do rzekomego nie działania dopóki nie dałeś endl to zapewne działało, ale po prostu znaki nie były wyprowadzone z bufora na ekran.
Użytkownik Chmurek edytował ten post 27 kwiecień 2006, 13:36