strtol
تحويل نص إلى عدد بأمان strtol
strtol تحوّل نصًا إلى long مع طريقة موثوقة لكشف الفشل الكامل والفشل الجزئي وتجاوز المدى، بعكس atoi.
المعامل الثاني endptr مؤشّر مؤشّر: بعد الاستدعاء يشير إلى أوّل حرف لم يُحوَّل. لو ساوى endptr بداية النص الأصلي فهذا يعني فشل التحويل بالكامل (ولا رقم صالح بالبداية). المعامل الثالث base يحدّد الأساس العددي — 10 للعشري، 16 للسادس عشري، أو 0 ليكتشف المترجم البادئة تلقائيًا (0x للسادس عشري، 0 للثماني).
عند تجاوز مدى long، تُرجع الدالة LONG_MAX أو LONG_MIN وتضبط errno على ERANGE. لأن strtol قد تُرجع 0 بحالات النجاح والفشل معًا، الطريقة الصحيحة للتحقق هي تصفير errno قبل الاستدعاء ثم فحصه بعده، بالإضافة لفحص endptr.
الصياغة
long strtol(const char *str, char **endptr, int base);
📄 مثال
#include <stdlib.h>
#include <errno.h>
char *end;
errno = 0;
long n = strtol("123abc", &end, 10);
// n == 123, end يشير إلى "abc"
if (end == "123abc") { /* لا تقارن هكذا؛ قارن بمؤشر النص الأصلي */ }
if (errno == ERANGE) { /* القيمة تجاوزت مدى long */ }أهم النقاط
| العنصر | الوظيفة |
|---|---|
| str | النص المراد تحويله |
| endptr | يُملأ بمؤشر لأوّل حرف غير محوَّل — قارنه بـ str لكشف فشل كامل |
| base | الأساس العددي: 10، 16، أو 0 للاكتشاف التلقائي من البادئة |
💡 نصائح عملية
- صفّر errno قبل الاستدعاء دائمًا — strtol لا تصفّره تلقائيًا
- استخدم strtod للأعداد العشرية (float/double) بنفس منطق strtol
⚠️ أخطاء شائعة
- تمرير NULL كـ endptr ثم محاولة استخدامه — يجب فحصه فقط لو مُرِّر مؤشّر فعلي
- نسيان تصفير errno قبل الاستدعاء فتحصل على قيمة قديمة من استدعاء سابق
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.