Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

إدخال السلاسل النصية باستخدام scanf

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 14 من 63.

الآن بعد أن فهمت كيفية عمل السلاسل النصية مع النهاية الصفرية (null terminator)، حان الوقت لتعلم كيفية الحصول على مدخلات نصية من المستخدمين. يمكن للدالة scanf قراءة السلاسل النصية باستخدام محدد التنسيق %s، ولكنها تأتي مع قيود مهمة يجب عليك فهمها.

لقراءة سلسلة نصية باستخدام scanf، تستخدم تنسيق %s وتمرر اسم مصفوفة الأحرف الخاصة بك (بدون معامل &، لأن أسماء المصفوفات هي عناوين بالفعل):

char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);

ومع ذلك، فإن لـ scanf("%s", ...) قيداً حرجاً: فهو يتوقف عن القراءة بمجرد مواجهته لأي حرف مسافة بيضاء (مسافة، أو علامة جدولة، أو سطر جديد). وهذا يعني أنه إذا قام المستخدم بكتابة "Hello World"، فإن scanf سيلتقط "Hello" فقط ويترك "World" في مخزن الإدخال المؤقت (input buffer).

هناك قلق جدي آخر وهو أن scanf لا يتحقق مما إذا كان الإدخال يتناسب مع حجم مصفوفتك. إذا أدخل شخص ما كلمة أطول مما يمكن لمصفوفتك استيعابه، فسيؤدي ذلك إلى حدوث تجاوز لسعة المخزن المؤقت (buffer overflow)، مما قد يؤدي إلى تعطل برنامجك أو خلق ثغرات أمنية. تأكد دائماً من أن مصفوفة الأحرف الخاصة بك كبيرة بما يكفي للإدخال المتوقع.

على الرغم من هذه القيود، فإن scanf("%s", ...) تُعد مناسبة تمامًا لقراءة الكلمات المفردة، وهو بالضبط ما ستتدرب عليه في التحدي القادم.

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح كيفية قراءة مدخلات نصية من المستخدم باستخدام scanf وعرضها مرة أخرى. يجب أن يقوم برنامجك بما يلي:

  1. قم بالتصريح عن مصفوفة أحرف (character array) باسم username تحتوي على 30 عنصراً لتخزين مدخلات المستخدم
  2. قم بالتصريح عن مصفوفة أحرف باسم hobby تحتوي على 25 عنصراً لتخزين مدخل آخر
  3. استخدم printf لمطالبة المستخدم بالرسالة "Enter your username:"
  4. استخدم scanf مع محدد التنسيق %s لقراءة اسم المستخدم في مصفوفة username
  5. استخدم printf لمطالبة المستخدم بالرسالة "Enter your hobby:"
  6. استخدم scanf مع محدد التنسيق %s لقراءة الهواية في مصفوفة hobby
  7. اطبع كلا السلسلتين النصيتين باستخدام printf بالتنسيق الموضح أدناه تماماً

سيتم توفير المدخلات ككلمتين منفردتين منفصلتين (بدون مسافات داخل كل كلمة).

يجب أن يعرض مخرج البرنامج النتائج بالتنسيق التالي:

Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!

على سبيل المثال، إذا أدخل المستخدم "Alice" كاسم مستخدم و "reading" كهواية، فيجب أن يكون المخرج:

Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!

يختبر هذا التحدي فهمك لاستخدام scanf مع محدد التنسيق %s لقراءة المدخلات النصية، والتصريح الصحيح عن مصفوفة الأحرف بحجم كافٍ، ودمج مدخلات المستخدم مع المخرجات المنسقة باستخدام printf.

ورقة مرجعية

لقراءة مدخلات نصية من المستخدمين، استخدم scanf مع محدد التنسيق %s:

char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);

قيود هامة لـ scanf("%s", ...):

  • يتوقف عن القراءة عند أي مسافة بيضاء (مسافة، علامة جدولة، سطر جديد)
  • يلتقط الكلمات المفردة فقط - "Hello World" تصبح "Hello" فقط
  • لا توجد حماية من تجاوز سعة المخزن المؤقت (buffer overflow) - تأكد من أن المصفوفة كبيرة بما يكفي
  • لا تستخدم عامل & مع أسماء المصفوفات (فهي عناوين بالفعل)

جرّب بنفسك

#include <stdio.h>

int main() {
    // TODO: قم بالتصريح عن مصفوفات الأحرف الخاصة بك هنا
    
    // TODO: اكتب الكود الخاص بك هنا للمطالبة وقراءة المدخلات
    
    // TODO: اطبع رسالة المخرجات النهائية
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow