|
Integer’dan String’e Dönüşüm |
|
Gönderiliyor lütfen bekleyin... |
|
|
Yazdığımız programlarda matematiksel
işlemler yaparken sayısal tiplere (integer, float, double, vb.) gereksinim
duyarız. Biz bu gereksinimi, işlemlerimizi yerine getirirken olduğu gibi,
sonuçları kullanıcıya yansıtırken de duyabiliriz. Bunun için sayısal tiplerimizi
C karakter dizilerine yani string’lere dönüştürmemiz gerekir.
Visual C++ Runtime (MSVCTR.DLL)
kütüphanesi bize bu tür dönüşüm işlemleri için gerekli tüm altyapıyı sağlamış
durumda. Ama meraklı ve paranoyak programcılar (benim gibi) dönüşüm işlemini
kendi başlarına, belki daha da süratli yapmayı tercih edebilirler.
Runtime kütüphanedeki
fonksiyonlara örnek verecek olursak:
char *_itoa( int value,
char *string, int radix );
char *_i64toa( __int64 value,
char *string, int radix );
char * _ui64toa( unsigned _int64
value, char *string, int radix );
wchar_t * _itow( int value,
wchar_t *string, int radix );
wchar_t * _i64tow( __int64
value, wchar_t *string, int radix );
wchar_t * _ui64tow(
unsigned __int64 value, wchar_t *string, int radix
);
|
Görüldüğü
üzere, pek çok fonksiyon mevcut. _itoa sınıfı fonksiyonlar integer bir sayıyı
string tipine dönüştürürler. Tabii Microsoft programcıları işleri basit tutmaya
değil de her zevke hitap etmeye eğilimli olduklarından fonksiyonlarına pek çok
opsiyon eklemişler. Oysa biz bu işlemi çok basit ve kullanışlı iki fonksiyonla
halledebileceğiz. Fonksiyonlarımızın imzaları şöyle olacak:
UINT IntToStr(int, char*);
UINT UintToStr(UINT, char*); |
Fonksiyonlarımızdan ilki IntToStr –2147483647’den +2147483647’ye
kadar olan sayıları, ikincisi UintToStr de 0’dan 4294967295’e kadar olan
sayıları string tipine dönüştürecek. Her iki fonsiyon da kaç karakteri yazdığını
geri dönecek. Burada dikkat etmemiz gereken nokta, gösterilen belleğin yani
char*’ın gösterdiği yerin yeterli sayıda ayırtılmış olması. Bu sayı
null-terminator da dahil IntToStr için 13, UintToStr için de 12’dir.
Fonsiyonların kullanımına bakarsak:
char buffer1[13];
IntToStr(-74374, buffer1);
char buffer2[12];
UintToStr(897263, buffer2); |
Dönüşüm
işlemi çok basit; sayımızı 0’a ulaşana dek 10’a böleceğiz, her bölme işleminin
kalanını da Ascii tablosunda ‘0’ a denk gelen 48 sayısı ile toplayıp sonucu
karakter olarak gösterilen belleğe yazacağız. En sonunda bellekte biriken
karakterlerin sırasını ters çevireceğiz. Bir örnek verecek olursak:
5784 % 10
= 4 --> 4 + 48 = 52 (‘4’) --> 5784 / 10 = 578
578 % 10
= 8 --> 8 + 48 = 56 (‘8’) --> 578 / 10 = 57
57 % 10
= 7 --> 7 + 48 = 55 (‘7’) --> 57 / 10 = 5
5 % 10
= 5 --> 5 + 48 = 53 (‘5’) --> 5 / 10 = 0.
Tabi ki
prosedür bununla da bitmiyor. İşlem çekirdeğinin çevresinde bazı ek işlemler
yatıyor. Örneğin IntToStr’de 0’dan küçük bir sayı için string’in başına bir ‘-‘
karakteri koymamız gerekiyor. Bunun gibi, dönüşümü tamamlanmış bir string’in
null karakteri ile sonlandırılması gerekiyor. Ve tabi ki dönüştürülmüş
karakterlerin ters çevrimesi de cabası…
Şimdi
dilerseniz fonksiyonlarımıza geçelim. Öncelikle IntToStr fonksiyonu:
UINT IntToStr(int nNumber, char* pc)
{
char* p = pc;
if (nNumber < 0) {
*p++ = ’-’;
nNumber = -nNumber;
}
char* p0 = p;
do {
*p++ = nNumber % 10 + ’0’;
nNumber /= 10;
} while (nNumber > 0);
UINT uLen = p - pc;
*p-- = ’\0’;
char t;
do
t = *p, *p = *p0, *p0 = t;
while (++p0 < --p);
return uLen;
}
|
Ve UintToStr fonksiyonu:
UINT UintToStr(UINT uNumber, char* pc)
{
char* p = pc;
do {
*p++ = uNumber % 10 + ’0’;
uNumber /= 10;
} while (uNumber > 0);
UINT uLen = p - pc;
*p-- = ’\0’;
char t;
do
t = *p, *p = *pc, *pc = t;
while (++pc < --p);
return uLen;
}
|
Bir sonraki yazımızda bu işlediğimiz
kavramın tersini, yani string’den integer’a dönüşümü inceleyeceğiz. O zamana
kadar kendinize iyi bakın ve güzel yazın.
Eylem Uğurel
[email protected]
Makale:
Integer’dan String’e Dönüşüm C++ ve C++.NET dili Eylem Uğurel
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|