إدخال السلاسل النصية باستخدام scanf
جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 14 من 63.
الآن بعد أن فهمت كيفية عمل السلاسل النصية مع المحرف المنهي الفارغ، حان وقت تعلّم كيفية الحصول على مدخلات السلاسل النصية من المستخدمين. يمكن للدالة 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" في مخزن الإدخال المؤقت.
ومن المخاوف الخطيرة الأخرى أن scanf لا يتحقق مما إذا كان الإدخال يتسع في مصفوفتك. إذا أدخل شخص ما كلمة أطول مما تستطيع مصفوفتك استيعابه، فسيؤدي ذلك إلى تجاوز سعة المخزن المؤقت، مما قد يتسبب في تعطل برنامجك أو حدوث ثغرات أمنية. احرص دائمًا على أن تكون مصفوفة الأحرف كبيرة بما يكفي للإدخال المتوقع.
على الرغم من هذه القيود، تُعد scanf("%s", ...) مناسبة تمامًا لقراءة الكلمات المفردة، وهذا بالضبط ما ستتدرب عليه في التحدي القادم.
التحدي
سهلاكتب برنامجًا بلغة C يوضّح قراءة مُدخلات نصية من المستخدم باستخدام scanf وعرضها مجددًا. يجب أن يقوم برنامجك بما يلي:
- يُصرّح عن مصفوفة محارف باسم
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.
جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: صرّح عن مصفوفات المحارف هنا
// TODO: اكتب الكود هنا لطلب الإدخال وقراءته
// TODO: اطبع رسالة الإخراج النهائية
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسيةتدرّب بنفسك: مترجم C عبر الإنترنت