هل تقوم FGTS () دائمًا بإنهاء السلسلة التي تُرجع؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

هل هذا آمن أن تفعل؟ يفعل fgets قم بإنهاء المخزن المؤقت مع NULL أو يجب أن أقوم بتعيين البايت العشرين على NULL بعد المكالمة إلى fgets وقبل الاتصال clean?

// strip new lines
void clean(char *data)
{
    while (*data)
    {
        if (*data == '\n' || *data == '\r') *data = '\0';
        data++;
    }
}

// for this, assume that the file contains 1 line no longer than 19 bytes
// buffer is freed elsewhere
char *load_latest_info(char *file)
{
    FILE *f;
    char *buffer = (char*) malloc(20);
    if (f = fopen(file, "r"))
        if (fgets(buffer, 20, f))
        {
            clean(buffer);
            return buffer;
        }
    free(buffer);
    return NULL;
}
هل كانت مفيدة؟

المحلول

نعم fgets() دائما فارغ بشكل صحيح يحمل المخزن المؤقت. من صفحة الرجل:

ال fgets () تقرأ الوظيفة على الأقل أقل من عدد الأحرف المحددة بواسطة ن من الدفق المحدد ويخزنهم في السلسلة س. تتوقف القراءة عند العثور على حرف خط جديد ، في نهاية الملف أو الخطأ. الخط الجديد ، إن وجد ، يتم الاحتفاظ به. إذا تم قراءة أي أحرف ولم يكن هناك خطأ ،\0'الحرف إلحاق لإنهاء السلسلة.

نصائح أخرى

إذا كان هناك خطأ ، يجوز لـ FGETS () أو لا يخزن أي بايت صفر في أي مكان في المخزن المؤقت. الكود الذي لا يتحقق من قيمة إرجاع FGETS () لن يكون آمنًا ما لم يضمن وجود صفر في المخزن المؤقت في مكان ما ؛ أسهل طريقة للقيام بذلك هي تخزين صفر إلى آخر بقعة. إن القيام بذلك سيعني أن الخطأ غير المرح أن يلاحظه أحد (اعتمادًا على التنفيذ) قد يتسبب في قراءة خط إضافي من البيانات ، ولكن لن ينطلق في سلوك غير محدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top