Kullanımlarına bakarsak:int StrToInt(const char*);
UINT StrToUint(const char*);
int i = StrToInt(-74374);
UINT u = StrToUint(897263);
Fonkiyonlarımızın çalışabilmesi için iki makroya da ihtiyacımız olacak. Bunlardan ilki _ISSPACE verilen bir karakterin boşluk grubuna ait olup olmadığını test ediyor. Biz bu makroyu, verilen stringi trimlemek için kullanacağız. İkinci makromuz ise _ISDIGIT. Bu makro da verilen bir karakterin sayısal bir karakter olup olmadığına bakıyor.
#define _ISSPACE(c)\
((0x09<=(c)&&(c)<=0x0d)||(c)==0x20)
#define _ISDIGIT(c)\
(0<=(c)&&(c)<=9)
Şimdi dilerseniz fonksiyonlarımıza geçelim. Öncelikle StrToInt fonksiyonu:
int StrToInt(const char* pz)
{
while (_ISSPACE(*pz))
++pz;
int nSign;
if (*pz == -) {
++pz;
nSign = -1;
} else {
if (*pz == +)
++pz;
nSign = +1;
}
int nAccum = 0;
char c;
while (c = *pz++, _ISDIGIT(c))
nAccum = nAccum * 10 + (c - 0);
return nSign * nAccum;
}
Ve StrToUint fonksiyonu:
UINT StrToUint(const char* pz)
{
while (_ISSPACE(*pz))
++pz;
char c = *pz++;
if (c == - || c == +)
c = *pz++;
UINT uAccum = 0;
while (_ISDIGIT(c)) {
uAccum = uAccum * 10 + (c - 0);
c = *pz++;
}
return uAccum;
}
Dönüşüm işleminin mantığını biraz inceleyelim. Her iki fonsiyon da temelde aynı yöntemi kullanıyorlar. Fakat farklı olarak StrToInt fonksiyonu, girilen stringin önünde - veya + karakterlerinin varlığını kontrol ediyor. Ortak olan işlem ise
uAccum = uAccum * 10 + (c - 0);
ifadesinde saklı. Bu basit ifade, string verisinin her karakterinin Ascii tablosundaki değerinden 48 çıkartıp, sonucu herseferinde 10 ile çarpılan uAccum değişkenine eklemek. Bu işlem, sayısal olmayan (örneğin null/terminator) bir karaktere rastlanıncaya kadar devam ediyor, hepsi bu
Özetleyecek olursak, string ve integer veri tipleri arasındaki dönüşüm, kullanıcı arayüzü olan uygulamaların bir çoğunda kullanılmaktadır. Peki bu dönüşümleri VC++ Runtime fonksiyonları yerine kendi kendimize niçin yapıyoruz? Buna yanıtımız daha sade, daha hızlı program yazma isteğimiz ve en önemlisi merakımızdır diyebiliriz.