دمج سلسلة نصية مع رقم في C++: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية دمج std::string مع int في C++: مطبات غير واضحة

\n\n

هل سبق لك أن كتبت شيئًا مثل "Hello" + 42 في C++ وحصلت بدلاً من "Hello42" المتوقع على مجموعة غريبة من الرموز؟ إذا كان الأمر كذلك، فأنت لست وحدك. هذا السؤال على Stack Overflow حصد عشرات الآلاف من المشاهدات، وليس من دون سبب. في C++، دمج سلسلة نصية مع رقم ليس مهمة تافهة كما في Python أو JavaScript. هنا تحتاج إلى معرفة بعض الحيل.

\n\n

في هذه المقالة، سنشرح 4 طرق لدمج std::string مع int، من الأبسط إلى الأكثر احترافية. ستتعرف على سبب عدم عمل str + num، وكيفية تجاوز هذا القيد، وأي طريقة تختار لمهمتك. هيا بنا!

\n\n

لماذا لا يعمل str + int؟ نبذة مختصرة عن الأنواع

\n\n

في C++، std::string هو كلاس، بينما int هو نوع عددي مدمج. العامل + لـ std::string مُحمَّل بشكل زائد، لكنه يتوقع أن يكون المعامل الثاني من نوع سلسلة نصية (std::string، const char* أو حرف). عندما تكتب "Hello" + 42، يحاول المترجم تفسير 42 كإزاحة حسابية لمؤشر إلى سلسلة نصية حرفية، وليس كرقم للإدراج.

\n\n

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

\n\n

الطريقة 1: std::to_string — الأبسط (C++11 والإصدارات الأحدث)

\n\n

بدءًا من C++11، ظهرت في المكتبة القياسية الدالة الرائعة std::to_string. تقوم بتحويل أي رقم (int، float، double، long، إلخ) إلى std::string. بعد ذلك، يتم دمج السلسلتين ببساطة.

\n\n
#include <iostream>\n#include <string>\n\nint main() {\n    std::string text = "رقم باي يساوي تقريباً ";\n    int pi_int = 3;\n\n    // تحويل int إلى سلسلة نصية ودمجها\n    std::string result = text + std::to_string(pi_int);\n    std::cout << result << std::endl; // الإخراج: رقم باي يساوي تقريباً 3\n\n    // يمكن كتابتها في سطر واحد\n    std::cout << "الإجابة: " + std::to_string(42) << std::endl;\n\n    return 0;\n}
\n\n

الإيجابيات: قابل للقراءة، قصير، لا حاجة لإضافة مكتبات إضافية (باستثناء <string>).
\nالسلبيات: لا يوجد تحكم في التنسيق (عدد الأرقام العشرية، الأصفار البادئة).

\n\n

الطريقة 2: std::ostringstream — ملك التنسيق

\n\n

إذا كنت بحاجة ليس فقط إلى الدمج، بل أيضًا إلى تنسيق الرقم (إضافة أصفار بادئة، تحديد الجزء العشري)، استخدم std::ostringstream من ملف الرأس <sstream>. هذا الأسلوب يحاكي عمل cout، لكنه يحفظ النتيجة في سلسلة نصية.

\n\n
#include <iostream>\n#include <sstream>\n#include <string>\n#include <iomanip> // لـ std::setw و std::setfill\n\nint main() {\n    int user_id = 7;\n    std::ostringstream oss;\n\n    // تنسيق: معرف مع أصفار بادئة حتى 3 أرقام\n    oss << "المستخدم #" << std::setw(3) << std::setfill('0') << user_id;\n    std::string formatted = oss.str();\n\n    std::cout << formatted << std::endl; // الإخراج: المستخدم #007\n\n    // مثال أكثر تعقيدًا: رقم عشري\n    double price = 19.5;\n    std::ostringstream oss2;\n    oss2 << "السعر: " << std::fixed << std::setprecision(2) << price << " روبل";\n    std::cout << oss2.str() << std::endl; // الإخراج: السعر: 19.50 روبل\n\n    return 0;\n}
\n\n

الإيجابيات: تحكم كامل في التنسيق، يعمل مع أي أنواع.
\nالسلبيات: كود أكثر تفصيلاً، يحتاج إلى تضمين <sstream> و <iomanip>.

\n\n

الطريقة 3: sprintf / snprintf — إرث لغة C (بحذر!)

\n\n

إذا كنت تعمل مع كود قديم أو لأي سبب لا يمكنك استخدام

المدونات

توصيات الكتب