ďťż

Ł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
  •