Koledzy mają rację. Jeśli liczysz na zmiennej typu char - dla obliczeń jest to zmienna 8-bitowa ze znakiem. Jednak gdy chcesz ją wyświetlić - jest to kod ASCI znaku. Dla wyświetlacza będzie to:
0-15 - znaki specjalne
16-31 - standard sterownika tego nie definiuje
32 w górę będą kolejno (mniej więcej): spacja, znaki w stylu cudzysłów, duże litery, małe litery.
Dla liczb ujemnych uzyskamy znaki chińskie lub inne (w tym miejscu pojawiają się czasami znaki zależne od producenta).
Jednak jest jeszcze jeden problem. Jeśli stworzymy funkcję pracującą na łańcuchu znakowym, a zamiast wskaźnika na łańcuch kończący się wartością 0 podamy zmienną typu char - program poleci w przysłowiowe maliny. Będzie próbował dostępu do pamięci o adresie wskazywanym przez aktualną wartość podanej zmiennej. Kompilator powinien zgłosić ostrzeżenie - chyba, że wykonano tzw. rzutowanie:
[center]piszlcd((char*)zmienna);[/center]
Tak czy inaczej, w takim przypadku rzutowanie nie zmienia kodu wynikowego, jest tylko poinformowaniem kompilatora: "spokojnie, wiem co tutaj robię, nie wyświetlaj ostrzeżeń, nawet jeśli Ci się to nie podoba". ;]
Konwersji najprościej można dokonać wymienioną już procedurą itoa. Jest ona zdeklarowana w pliku nagłówkowym <stdlib.h>. Może to się wydać oczywiste, na wszelki wypadek jednak przypomnę, że wskaźnik na łańcuch podawany do funkcji musi być wskaźnikiem na istniejący obiekt! Zapis jak niżej jest nieprawidłowy:
program nie będzie działał. Ma szanse działać, ale nie wiemy gdzie funkcja itoa będzie na prawdę pisać - może pisać do stosu, do obszaru zmiennych globalnych, na stertę... etc.
Prawidłowe wywołanie będzie wyglądało następująco:
Kod: Zaznacz cały
char bufor[8]; // zwiększyć jeśli spodziewamy się więcej niż 7 znaków
itoa(licznik, bufor, 10);
Powyżej piszę z pamięci, więc nie daje 100% gwarancji, że proponowana wersja "dobra" jest dobra ;D
Pozdrawiam