المشكلة التي تواجهها في برنامجك هي أنك تقوم بإنشاء مصفوفة testCases
بحجم معين totalStrings
قبل قراءة القيم الفعلية للسلاسل من المدخل. ثم بعد ذلك، تقوم بإضافة السلاسل إلى المصفوفة باستخدام push_back
، الذي يضيف عنصرًا جديدًا إلى نهاية المصفوفة. هذا يعني أن السلاسل الفارغة أيضًا تُضاف إلى المصفوفة لأنه لم يتم تحديد الحجم الفعلي للمصفوفة في البداية.
لحل هذه المشكلة، يمكنك تحديد الحجم الفعلي للمصفوفة بعد قراءة القيمة totalStrings
من المدخل. وبما أنك تريد استخدام حلقة while
لقراءة السلاسل، يمكنك تعديل الكود كما يلي:
cpp#include
#include
#include
using namespace std;
void printCustom(const string& str) {
cout << str << endl;
}
int main() {
int totalStrings;
cin >> totalStrings;
vector testCases;
string inputs;
while (cin >> inputs) {
testCases.push_back(inputs);
}
for (const string& str : testCases) {
printCustom(str);
}
return 0;
}
في هذا الكود، يتم تحديد المصفوفة testCases
بدون تحديد الحجم في البداية. ثم يتم قراءة القيمة totalStrings
من المدخل، وبعد ذلك يتم قراءة السلاسل داخل حلقة while
وإضافتها إلى المصفوفة باستخدام push_back
. بعد ذلك، يتم استخدام حلقة for
لطباعة السلاسل المخزنة في المصفوفة.
باستخدام هذا التعديل، يجب أن تتجنب الطباعة غير المرغوب فيها للسلاسل الفارغة وستطبع فقط السلاسل التي تم إدخالها بواسطة المستخدم.
المزيد من المعلومات
بعد تعديل الكود لحل المشكلة المذكورة، يمكن أن نتحدث بشكل أعمق حول الأسباب التي أدت إلى حدوث هذه المشكلة وكيفية تجنبها في المستقبل.
عندما تقوم بتعريف مصفوفة مثل vector
، يتم تخصيص الذاكرة الكافية لتخزين totalStrings
سلاسل فارغة في المصفوفة. ومع ذلك، فيما بعد تقوم بقراءة السلاسل الفعلية من المدخل باستخدام حلقة while
، وتضيف كل سلسلة جديدة باستخدام push_back
، مما يؤدي إلى إضافة السلاسل الفارغة بالإضافة إلى السلاسل الفعلية إلى المصفوفة. هذا يحدث لأن push_back
يضيف العنصر إلى نهاية المصفوفة، سواء كانت نهايتها فعليًا أم لا.
لحل هذه المشكلة، يجب تحديد الحجم الفعلي للمصفوفة بعد قراءة القيمة totalStrings
من المدخل. هذا يتيح لك تخصيص الذاكرة بشكل صحيح لتخزين السلاسل الفعلية بدلاً من تخصيص الذاكرة لعدد معين من السلاسل الفارغة.
أحد النقاط الأخرى التي يمكن التركيز عليها هي استخدام معيار النطاق المتعدد (range-based for loop
) في C++11 وما بعده، بدلاً من حلقة for
التقليدية. يجعل استخدام معيار النطاق المتعدد الكود أكثر وضوحًا وأكثر أمانًا، ويقلل من فرص وقوع الأخطاء.
أخيرًا، يجب دائمًا التحقق من صحة الإدخال قبل استخدامه. في الكود السابق، يتم افتراض أن المدخلات القادمة ستكون صالحة. ومع ذلك، في تطبيقات الواقع، قد تواجه بيانات غير صالحة أو تنسيقات مفقودة، ولذا يجب دائمًا إضافة التحقق من الصحة لضمان استدعاء الدوال والمعالجة السليمة للبيانات.
من خلال اتباع هذه النصائح، يمكنك تجنب مشاكل مثل الطباعة غير المرغوب فيها للسلاسل الفارغة وضمان أداء البرنامج بشكل صحيح وفعال.