إدخال السلاسل النصية باستخدام 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", ...) تُعد مناسبة تمامًا لقراءة الكلمات المفردة، وهو بالضبط ما ستتدرب عليه في التحدي القادم.
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية قراءة مدخلات نصية من المستخدم باستخدام scanf وعرضها مرة أخرى. يجب أن يقوم برنامجك بما يلي:
- قم بالتصريح عن مصفوفة أحرف (character array) باسم
usernameتحتوي على 30 عنصراً لتخزين مدخلات المستخدم - قم بالتصريح عن مصفوفة أحرف باسم
hobbyتحتوي على 25 عنصراً لتخزين مدخل آخر - استخدم
printfلمطالبة المستخدم بالرسالة "Enter your username:" - استخدم
scanfمع محدد التنسيق%sلقراءة اسم المستخدم في مصفوفةusername - استخدم
printfلمطالبة المستخدم بالرسالة "Enter your hobby:" - استخدم
scanfمع محدد التنسيق%sلقراءة الهواية في مصفوفةhobby - اطبع كلا السلسلتين النصيتين باستخدام
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية