تخطَّ إلى المحتوى

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 الكامل بالعربي.