البرمجة

فهم تفاعل getline في C++

السؤال الذي طرحته يعكس استفسارًا حول سلوك غير متوقع لدالة getline في لغة البرمجة C++. يبدو أنك تواجه صعوبة في فهم تفاعل cin و getline معًا في البرنامج الخاص بك. دعوني ألقي نظرة على الكود وأقدم لك تفسيرًا مفصلاً للتصرف الذي تشهده.

في البرنامج الذي كتبته، تستخدم أولاً cin لقراءة اسم المستخدم، ومن ثم تستخدم getline للقراءة الإضافية. ومع ذلك، يبدو أن هناك تبادلًا غير متوقعًا في ترتيب العمليات.

عند استخدام cin, يتم قراءة الكلمة الأولى “Jai” فقط وتتوقف العملية عندما يتم الوصول إلى المسافة. لذا، عند استخدام getline بعد ذلك، يتم قراءة باقي السطر الذي يحتوي على “Simha Verma” كسلسلة فارغة. هذا هو سبب ظهور “Simha Verma” في الإخراج.

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

cpp
#include #include #include int main() { std::string input; std::cout << "What is your name? "; std::getline(std::cin, input); // استخدام istringstream لتحليل السلسلة إلى كلمات فردية std::istringstream iss(input); std::string name; iss >> name; std::cout << "Hello, " << name << "!" << std::endl; }

هذا التعديل يضمن قراءة السطر بأكمله باستخدام getline ثم يستخدم istringstream لتحليل السلسلة واستخراج الاسم.

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

في عالم برمجة C++، يمكن أن يكون السلوك الذي واجهته في برنامجك مثيرًا للحيرة للعديد من المبرمجين، لذلك دعوني أوسع نطاق التحليل لتزويدك بمزيد من المعلومات.

دالة std::getline في C++ تقوم بقراءة سلسلة كاملة من المدخلات حتى تصل إلى حرف newline (\n) أو تنتهي عملية الإدخال. في حالة برنامجك، بعد أن يتم قراءة اسم المستخدم باستخدام std::cin، يبدو أن عملية القراءة بواسطة std::getline تأتي بعد ذلك دون تنظيم مناسب.

تلاحظ أن استخدام std::getline داخل البرنامج يؤدي إلى قراءة السطر الفارغ الذي تم تركه بعد أول إدخال (Jai Simha Verma). هذا يفسر لماذا يبدو الإخراج غير متوقع.

لتفادي هذا، يمكنك تنظيم عملية الإدخال باستخدام std::cin.ignore() لتجاوز الحرف الجديد. يمكنك تحسين البرنامج كما يلي:

cpp
#include #include int main() { std::string name; std::cout << "What is your name? "; std::getline(std::cin, name); // تجاوز الحرف الجديد std::cin.ignore(); std::cout << "Hello, " << name << "!" << std::endl; return 0; }

هذا التعديل يستخدم std::cin.ignore() لتجاوز الحرف الجديد الذي يتم تركه بعد الإدخال الأول، وبالتالي يضمن أن std::getline لا تأخذ سطرًا فارغًا كإدخال لاحق.

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