هل هناك ما يعادله Strtol لا يتطلب سلسلة من إنهاء null؟

StackOverflow https://stackoverflow.com/questions/1085996

  •  23-08-2019
  •  | 
  •  

سؤال

هل هناك وظيفة C قياسية مشابهة ل Strtol والتي ستأخذ سحر * وطول سلسلة غير فارغة؟

أعلم أنه يمكنني نسخ السلسلة إلى منطقة ذات شهرين، ولكن لأسباب فعالة غير مرغوب فيها.

شكرا.

هل كانت مفيدة؟

المحلول

لا مثل هذه الوظيفة في المكتبة القياسية. سوف تضطر إما إلى استخدام الأسلوب المخزن المؤقت المؤقت أو كتابة وظيفتك الخاصة من الصفر.

نصائح أخرى

للإجابة على سؤالك: لا، لا توجد وظيفة قياسية، ولكنها بسيطة بما يكفي لكتابة بنفسك:

#include <stdio.h>
#include <ctype.h>

int natoi(char *s, int n)
{
    int x = 0;
    while(isdigit(s[0]) && n--)
    {
        x = x * 10 + (s[0] - '0');      
        s++;
    }
    return x;
}

int main(int argc, char*argv[])
{
    int i;
    for(i = 1; i < argc; i++)
        printf("%d: %d\n", i, natoi(argv[i], 5));
}

strntol. ربما ما أنت بعد ... إنه ليس C قياسي، على الرغم من ذلك.

إذا كنت الذي - التي الضغط على الكفاءة، ربما يمكنك تحفيز الوقت الكتب والتصحيح الخاص بك.

ولكن: فقط تفعل ذلك مع نسخة؛ من المحتمل أن يكون لديك ملزمة أعلى من المدة التي يمكن أن تكون السلسلة بها (رقم عشري يناسب long لديه ملزمة علوية صارمة على الحد الأقصى لطولها)، حتى تتمكن من الحصول على مخزن مؤقت ثابت. ثم ملف التعريف الخاص بك التطبيق بأكمله، ومعرفة ما إذا كان النسخ / التحويل هو حقا عنق الزجاجة. إذا كان الأمر كذلك، فأنت تعلم أنك بحاجة إلى كتابة خاصة بك.

إليك نقطة انطلاق صعبة (مكتوب ومتصفح):

long limited_strtol(const char *string, size_t len)
{
  long sign = 1;
  long value = 0;

  for(; len > 0 && *string == '-'; string++, len--)
    sign *= -1;

  for(; len > 0 && isdigit(*string); string++, len--)
  {
   value *= 10;
   value += *string - '0';
   len--;
   string++;
  }
  return sign * value;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top