البرمجة

تقسيم النصوص في لغة C

لديك واجب برمجي يتطلب منك بناء برنامج يستقبل حتى 30 حرفًا من المستخدم، ثم يقوم بتحويل النص المدخل. على سبيل المثال، يجب أن يقوم البرنامج بعكس الجملة ثم طباعتها، أو تدويرها. قمت بمحاولة نسخ الكلمات في الجملة كل منها على حدة إلى مصفوفة بحجم [30][31] ولكنها لم تنجح، وترغب في فهم السبب في ذلك.

أولاً، يجدر بنا أن نلقي نظرة على الشيفرة التي كتبتها. بدايةً، تقوم بتعريف مصفوفتين، الأولى st لاستيعاب النص المدخل من المستخدم، والثانية arr لتخزين الكلمات المستخلصة من هذا النص. ثم تقوم بعمل حلقة while لمعالجة النص المدخل. داخل الحلقة، تقوم بفحص كل حرف في النص. إذا كان الحرف حرفًا كبيرًا (أي حرفًا من الأبجدية الإنجليزية)، فإنك تقوم بحساب عدد الأحرف، وتخزين الحرف في مصفوفة arr، ثم تحريك المؤشرين i وj للمتابعة. إذا كان الحرف فراغًا، فإنك تقوم بوضع فراغ في arr وتقوم بتحريك i و j لتجاوز الفراغات المتتالية. وإذا كان الحرف نهاية النص (\0)، فإنك تنهي العملية.

لكن هناك مشكلة تظهر في جزء الشفرة الذي يحاول نسخ الكلمات إلى مصفوفة mat. لا يبدو أنه يتم تحديث المتغيرات word و letter بالطريقة الصحيحة داخل الحلقة، وهذا يتسبب في دخول حلقة غير منتهية. كما أن استخدام strcpy لنسخ الكلمة إلى mat ليس الطريقة الصحيحة هنا، حيث أنه يعيد نسخ الكلمة بأكملها في كل دورة.

لحل هذه المشكلة، يمكنك القيام بالآتي:

  1. تعريف متغيرين جديدين لتتبع موقع الكلمات في arr وهما start و end.
  2. استخدام دورة للتحقق من الكلمات ونسخها إلى mat.
  3. استخدام دورة آخرى لطباعة mat بعد الانتهاء من نسخ الكلمات.

بتطبيق هذه الخطوات، يمكنك تصحيح الشفرة وجعلها تقوم بالوظيفة المطلوبة بشكل صحيح.

المزيد من المعلومات

بالطبع، سأوضح المزيد من المعلومات لمساعدتك في فهم الوضع بشكل أفضل.

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

ثانيًا، بالنسبة للمشكلة التي تواجهها في تقسيم النص إلى كلمات ونسخها إلى المصفوفة mat، يجب أن تتبع الخطوات التالية:

  1. قم بتحديد المواقع التي تبدأ منها الكلمات في المصفوفة arr، والتي تتمثل في المؤشر start.
  2. بعد ذلك، قم بالبحث عن المواقع التي تنتهي فيها الكلمات في المصفوفة arr، والتي تتمثل في المؤشر end.
  3. استخدم start و end لنسخ الكلمة الموجودة بين هاتين المؤشرات إلى مصفوفة mat.
  4. بعد نسخ الكلمة، قم بتحديث start و end للبحث عن الكلمة التالية.

هذا النهج سيسمح لك بتقسيم النص إلى كلمات بشكل صحيح ونسخها إلى المصفوفة mat بدون مشاكل. كما أشرت في ردي السابق، يمكنك استخدام حلقة للتحقق من الكلمات ونسخها إلى mat، ثم حلقة أخرى لطباعة mat بعد الانتهاء من نسخ الكلمات. هذا سيضمن تنفيذ البرنامج بشكل صحيح وفعال دون وجود أخطاء.

مقالات ذات صلة

زر الذهاب إلى الأعلى