2012-07-01 15 views
6

according documentation:strtol() öğesinin başarılı bir şekilde döndüğünden nasıl emin olabilirim? Başarı

, fonksiyon bir uzun int değeri olarak dönüştürülmüş tam sayısı verir. Geçerli bir dönüşüm gerçekleştirilemezse, sıfır değeri döndürülür. Doğru değer, gösterilebilir değerler aralığının dışındaysa, LONG_MAX veya LONG_MIN döndürülür ve global değişken errno ERANGE olarak ayarlanır.

işlevi başarısız oldu veya sadece "0" sayı ile dize dönüştürülür ise strtol(str, (char**)NULL, 10); str eğer "0\0" bilmek olduğunu düşünün?

+1

dikkatinizden kaçmış 'scanf'? –

+2

@StevenLuu: 'scanf' daha da kötü bir hata işleme özelliğine sahiptir. Bazı uygulamalar genellikle taşma üzerine çöp verir, ancak hatayı herhangi bir şekilde bildirmeden. –

cevap

11
Eğer "0" kaynaklanan 0 değerlerini ayırt ve "pqr" kaynaklanan 0 değerlerinden benzer; böylelikle, hata denetimi istiyorsanız gerçek bir işaretçi adresi geçmesi gerekiyor

:

char *endptr; 
errno = 0; 
long result = strtol(str, &endptr, 10); 
if (endptr == str) 
{ 
    // nothing parsed from the string, handle errors or exit 
} 
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE) 
{ 
    // out of range, handle or exit 
} 
// all went fine, go on 
+0

Denerim ! Teşekkürler! – Jack

+0

Daniel: Sana birkaç şey sormam gerek. Bu sohbete (http://chat.stackoverflow.com/rooms/4064/haskell) gelebilir misiniz? – Nawaz

+0

neden sadece "(errno == ERANGE)" hatası olup olmadığını kontrol etmek için değil? – Undefined

1

Sen errno kontrol etmek veya ikinci argüman için NULL olmayan bir değer geçmek ve benzeri str onun ortaya çıkan değeri karşılaştırabilirsiniz ya:

char * endptr; 
long result = strtol(str, &endptr, 10); 
if (endptr > str) 
{ 
    // Use result... 
} 
1

IMHO, ben atoi() veya strtol() için sscanf() tercih ederim. ana sebep güvenilir bazı platformlarda size (eğer başarısız olursa eğer başarılı olursanız 1 ve 0 döndüren) sscanf() kullanmak sürece (yani Windows) üzerinde hata durumunu kontrol olabilir.

+0

Neden bazı platformlarda hata durumunu kontrol edemiyorum? IMHO: 'strtol()', hata durumunda bir negatif değer döndürür .. – Jack

+0

@Jack longs de negatif olabilir. – Turix

+0

'scanf', taşma arızasında bir hata vermez. Dönüşüm başarısızlığı 'strtol' ile kolaydır, yalnızca taşma kontrolü kontrol etmekte sıkıcıdır. –

İlgili konular