تحويل String إلى Int في C++: شرح عملي لأشهر طريقتين مع أمثلة
مقدمة: لماذا نحتاج إلى تحويل String إلى Int في C++؟
أثناء البرمجة باستخدام C++ ستواجه كثيراً مواقف تحتاج فيها إلى تحويل نوع بيانات إلى نوع آخر. ومن أكثر العمليات شيوعاً تحويل قيمة نصية من نوع string إلى عدد صحيح من نوع int، خاصة عند قراءة المدخلات من المستخدم أو التعامل مع البيانات القادمة من ملفات أو واجهات خارجية.
في هذا الدليل ستتعرف على طريقتين شائعتين وعمليتين لتنفيذ هذا التحويل في C++، مع توضيح الفكرة خطوة بخطوة وأمثلة برمجية واضحة.

أنواع البيانات الأساسية في C++
توفّر لغة C++ مجموعة من أنواع البيانات المدمجة التي تُستخدم لتخزين قيم مختلفة، ومن أشهرها:
intلتخزين الأعداد الصحيحة مثل10و150.doubleلتخزين الأعداد العشرية مثل5.0و4.5.charلتخزين محرف واحد مثل'D'أو'!'.stringلتخزين سلسلة من المحارف مثل"Hello".boolلتخزين القيم المنطقية مثلtrueأوfalse.
وتُعد C++ لغة strongly typed، وهذا يعني أنك تحتاج إلى تحديد نوع البيانات بشكل صريح عند إنشاء أي متغير. لذلك لا يمكن التعامل مع النصوص والأرقام على أنها الشيء نفسه بدون تحويل مناسب.
كيفية التصريح عن متغير من النوع Int في C++
لإنشاء متغير من النوع int، تكتب أولاً نوع البيانات ثم اسم المتغير، وبعد ذلك تنهي التعليمة بالفاصلة المنقوطة.
#include <iostream>
int main() {
int age;
}
بعد التصريح عن المتغير، يمكنك إسناد قيمة له لاحقاً:
#include <iostream>
int main() {
int age;
age = 28;
}
كما يمكنك تنفيذ التصريح والتهيئة في خطوة واحدة، ثم طباعة الناتج:
// a header file that enables the use of functions for outputing information
// e.g. cout or inputing information e.g. cin
#include <iostream>
// a namespace statement; you won't have to use the std:: prefix
using namespace std;
int main() {
// start of main function of the program
int age = 28;
// output to the console: "My age is 28"
cout << "My age is: " << age << endl;
}
// end the main function
كيفية التصريح عن String وتهيئته في C++
الـ string هو سلسلة من المحارف. وطريقة التصريح عنه تشبه إلى حد كبير التصريح عن int، لكنك تحتاج إلى تضمين المكتبة <string> حتى تتمكن من استخدامه.
#include <iostream>
#include <string>
using namespace std;
int main() {
// declare a string variable
string greeting;
greeting = "Hello";
}
ويمكنك أيضاً تهيئة المتغير النصي مباشرة ثم طباعته:
#include <iostream>
#include <string>
using namespace std;
int main() {
// initialize a string variable
string greeting = "Hello";
// output "Hello" to the console
cout << greeting << endl;
}
لماذا لا ينجح التحويل المباشر من String إلى Int؟
بما أن C++ لغة صارمة في أنواع البيانات، فإن محاولة تحويل string إلى int باستخدام type casting التقليدي لن تنجح كما يحدث مثلاً عند تحويل double إلى int.
على سبيل المثال، الكود التالي غير صحيح:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "7";
int num;
num = (int) str;
}
والسبب أن string كائن نصي، وليس قيمة رقمية خام يمكن تحويلها مباشرة بهذا الأسلوب. لذلك تحتاج إلى استخدام دوال أو أدوات مخصصة لفهم النص واستخراج القيمة العددية منه.
من الأخطاء الشائعة الناتجة عن هذا الأسلوب:
hellp.cpp:9:10: error: no matching conversion for C-style cast from 'std::__1::string' to 'int'
num = (int) str;
أفضل طرق تحويل String إلى Int في C++
توجد عدة وسائل لإجراء هذا التحويل، لكن من أكثرها شيوعاً واعتماداً:
- استخدام الدالة
stoi(). - استخدام الفئة
stringstream.
فيما يلي شرح كل طريقة ومتى يفضل استخدامها.
الطريقة الأولى: تحويل String إلى Int باستخدام stoi()
تُعد الدالة stoi() من أسهل وأوضح الطرق لتحويل النص إلى عدد صحيح. وقد أصبحت متاحة بدءاً من C++11، لذلك فهي مناسبة للمشاريع الحديثة.
فكرة هذه الدالة بسيطة: تستقبل قيمة من النوع string وتُرجع المقابل العددي لها من النوع int.
#include <iostream>
#include <string>
using namespace std;
int main() {
// a string variable named str
string str = "7";
// print to the console
cout << "I am a string " << str << endl;
// convert the string to int
int num = stoi(str);
// print to the console
cout << "I am an int " << num << endl;
}
الناتج:
I am a string 7
I am an int 7
مزايا استخدام stoi()
- سهلة القراءة والفهم.
- مناسبة لمعظم تطبيقات C++ الحديثة.
- تختصر عليك خطوات كثيرة مقارنة ببعض الأساليب الأقدم.
متى تستخدم stoi()؟
إذا كنت تعمل على مشروع يدعم C++11 أو إصداراً أحدث، فغالباً ستكون stoi() هي الخيار الأول بسبب بساطتها ووضوحها.
الطريقة الثانية: تحويل String إلى Int باستخدام stringstream
قبل شيوع stoi()، كان كثير من المطورين يستخدمون stringstream لتحويل النصوص إلى أرقام. وما زالت هذه الطريقة مفيدة، خاصة عند التعامل مع شيفرات أقدم أو عند الحاجة إلى معالجة نصية مرنة.
لاستخدام هذه الفئة، تحتاج أولاً إلى تضمين المكتبة <sstream> في أعلى البرنامج.
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
// create a stringstream object
stringstream ss;
// a variable named str, that is of string data type
string str = "7";
// a variable named num, that is of int data type
int num;
// extract the string from the str variable
ss << str;
// place the converted value to the int variable
ss >> num;
// print to the console
cout << num << endl;
}
الناتج سيكون:
7
كيف تعمل stringstream؟
تعتمد stringstream على إنشاء تدفق نصي يمكن إدخال النص إليه ثم استخراج القيمة المطلوبة منه بصيغة رقمية. وهي آلية مفيدة عندما تحتاج إلى تحويلات متعددة أو تحليل نصوص أكثر تعقيداً.
متى تكون stringstream خياراً مناسباً؟
- عند التعامل مع مشاريع قديمة في C++.
- عندما تحتاج إلى تحليل نصوص واستخراج أكثر من قيمة من السلسلة نفسها.
- إذا كنت تفضّل أسلوب التدفقات streams في المعالجة.
مقارنة سريعة بين stoi() و stringstream
| الطريقة | سهولة الاستخدام | التوافق | الاستخدام الأنسب |
|---|---|---|---|
stoi() |
عالية جداً | تتطلب C++11 أو أحدث | المشاريع الحديثة والتحويل المباشر |
stringstream |
متوسطة | مناسبة لأساليب أقدم أيضاً | تحليل النصوص أو الشيفرات القديمة |
نصائح مهمة عند تحويل String إلى Int
- تأكد أن السلسلة النصية تحتوي فعلاً على أرقام قابلة للتحويل.
- استخدم
stoi()عندما تريد حلاً سريعاً وواضحاً في البيئات الحديثة. - استخدم
stringstreamإذا كنت تعمل على معالجة نصية أوسع من مجرد تحويل بسيط. - تجنّب الاعتماد على C-style cast مع
stringلأنه لن يحقق النتيجة المطلوبة.
الخلاصة التقنية
تحويل string إلى int في C++ ليس عملية تحويل مباشرة باستخدام casting التقليدي، بل يتطلب أداة مخصّصة مثل stoi() أو stringstream. من الناحية العملية، تُعد stoi() الخيار الأفضل في أغلب المشاريع الحديثة لأنها أبسط وأكثر وضوحاً، بينما تبقى stringstream مفيدة في السيناريوهات التي تتضمن تحليل النصوص أو دعم الشيفرات القديمة. اختيار الطريقة المناسبة يعتمد على إصدار C++ المستخدم وطبيعة المشروع نفسه.