السؤال الذي طرحته يعكس استفسارًا حول سلوك غير متوقع لدالة 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
لا تأخذ سطرًا فارغًا كإدخال لاحق.