0Pricing
C Academy · درس

مزالق الإدخال والإخراج الشائعة

مشكلات المخزن المؤقت ومحارف السطر الجديد

مزالق الإدخال والإخراج الشائعة درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

أخطاء شائعة في الإدخال والإخراج

يتضمن الإدخال والإخراج في C بعض المشكلات المتكررة. ومعرفتها يوفر عليك ساعات من تصحيح الأخطاء.

#include <stdio.h>
int main(void) {
    printf("Let us study I/O pitfalls\n");
    return 0;
}

حرف السطر الجديد المتبقي

بعد scanf("%d", ...) يترك مفتاح Enter محرف \n في المخزن المؤقت. وعندئذ يقرأ %c اللاحق محرف السطر الجديد بدلًا من الإدخال الفعلي.

#include <stdio.h>
int main(void) {
    char c = 'A';
    printf("Use a space before %%c to skip the leftover newline\n");
    printf("c = %c\n", c);
    return 0;
}

إصلاح المشكلة باستخدام مسافة

تخبر كتابة scanf(" %c", &c) مع وضع مسافة في البداية scanf بتجاوز المسافات البيضاء أولًا.

#include <stdio.h>
int main(void) {
    char c = 'Z';
    printf("scanf(\" %%c\", &c) skips whitespace\n");
    printf("c = %c\n", c);
    return 0;
}

نسيان علامة العطف

يؤدي تمرير متغير إلى scanf من دون & إلى التخزين في عنوان خاطئ، ومن المرجح أن يتسبب في تعطل البرنامج.

#include <stdio.h>
int main(void) {
    int n = 9;
    printf("Always pass &n, not n, to scanf for an int\n");
    printf("n = %d\n", n);
    return 0;
}

محددات تنسيق غير متطابقة

تؤدي قراءة قيمة double باستخدام %f بدلًا من %lf في scanf إلى إفساد القيمة. يستخدم الإخراج %f لكليهما، لكن الإدخال يختلف.

#include <stdio.h>
int main(void) {
    double d = 2.5;
    printf("scanf needs %%lf for double; printf uses %%f\n");
    printf("d = %.1f\n", d);
    return 0;
}

التخزين المؤقت للإخراج

قد يُخزَّن الإخراج مؤقتًا ولا يظهر فورًا. ويؤدي إنهاء الإخراج بـ \n أو استدعاء fflush(stdout) إلى تفريغ المخزن المؤقت.

#include <stdio.h>
int main(void) {
    printf("Flushed by newline\n");
    fflush(stdout);
    return 0;
}

الدالة gets خطيرة

لم تكن الدالة القديمة gets تتحقق من حدود المخزن المؤقت، وقد أزيلت من إصدارات C الحديثة. استخدم fgets بدلًا منها.

#include <stdio.h>
int main(void) {
    char buf[10];
    /* fgets(buf, sizeof buf, stdin); */
    buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
    printf("buf = %s\n", buf);
    return 0;
}

تجاوز المخزن المؤقت مع %s

يمكن لـ %s العادي في scanf أن يكتب بعد نهاية مصفوفة صغيرة. قيّده باستخدام عرض مثل %19s.

#include <stdio.h>
int main(void) {
    char name[20];
    printf("Use %%19s to leave room for the null terminator\n");
    name[0] = 0;
    printf("name length cap protects buffer\n");
    return 0;
}

تحتفظ fgets بمحرف السطر الجديد

تخزّن fgets محرف السطر الجديد في النهاية. وغالبًا ما تحتاج إلى إزالته.

#include <stdio.h>
#include <string.h>
int main(void) {
    char line[] = "hello\n";
    line[strcspn(line, "\n")] = 0;
    printf("[%s]\n", line);
    return 0;
}

تجاهل قيم الإرجاع

يعني عدم التحقق من قيمة إرجاع scanf أن الإدخال غير الصحيح يمر بصمت. تحقّق منها دائمًا.

#include <stdio.h>
int main(void) {
    int n = 3;
    int items = 1;
    if (items != 1)
        printf("bad input\n");
    else
        printf("ok: %d\n", n);
    return 0;
}

جمع الأجزاء بأمان

نمط متين: اقرأ باستخدام fgets، وحلّل باستخدام sscanf، ثم تحقّق من النتيجة.

#include <stdio.h>
int main(void) {
    char line[] = "123";
    int n;
    if (sscanf(line, "%d", &n) == 1)
        printf("parsed %d\n", n);
    return 0;
}

اختبار سريع

اختبر مدى فهمك لمشكلات الإدخال والإخراج.

مراجعة: مشكلات الإدخال والإخراج الشائعة

تعلمت كيفية تجنب الأخطاء الشائعة.

  • تربك محارف السطر الجديد المتبقية %c؛ استخدم مسافة في البداية
  • مرّر العناوين دائمًا باستخدام &
  • استخدم %lf لقراءة قيم double
  • فضّل fgets على gets، وقيّد %s
  • تحقق من قيم الإرجاع وفرّغ مخزن الإخراج المؤقت

الأسئلة الشائعة

هل درس «مزالق الإدخال والإخراج الشائعة» مجاني؟

نعم — نص درس «مزالق الإدخال والإخراج الشائعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «مزالق الإدخال والإخراج الشائعة»؟

مشكلات المخزن المؤقت ومحارف السطر الجديد تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «مزالق الإدخال والإخراج الشائعة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. محدِّدات تنسيق printf
  2. scanf والإدخال
  3. العرض والدقة والأعلام
  4. مزالق الإدخال والإخراج الشائعة
← العودة إلى C Academy