التكرار عبر كلمات سلسلة نصية في C++: 5 طرق من المبتدئ إلى المحترف

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

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

ابدأ الدورة

تفكيك السلسلة النصية إلى ذرات: كيفية التنقل عبر الكلمات في C++ (دون كسر عقلك)



تخيل: أنت تكتب محلل سجلات، أو محلل أوامر، أو ببساطة تريد حساب الكلمات في جملة. أول ما يتبادر إلى الذهن هو أخذ السلسلة النصية والتنقل عبر كل كلمة على حدة. في Python يتم ذلك في سطر واحد: "hello world".split(). لكننا في C++، مما يعني أن البساطة ترف يجب أن تستحقه.



سؤال "How do I iterate over the words of a string?" على Stack Overflow حصد مئات الآلاف من المشاهدات. وهذا ليس من قبيل الصدفة: المبتدئون يغرقون في تفاصيل التعامل مع الذاكرة، بينما يبحث المحترفون عن توازن بين السرعة وسهولة القراءة. في هذه المقالة، سنستعرض 5 طرق للتكرار عبر الكلمات في C++، ونقارن أداءها، ونفهم متى نستخدم أيًا منها.



إذا سبق لك أن كتبت strtok وحصلت على segfault، أو حاولت إدراج std::regex في حلقة ساخنة، فهذه المقالة لك.



الطريقة رقم 1: الكلاسيكية — std::istringstream



الطريقة الأكثر أمانًا وبديهية للمبتدئين. تعمل std::istringstream كتيار: تقرأ منه الكلمات المفصولة بمسافات.



#include <iostream>#include <sstream>#include <string>#include <vector>

int main() { std::string text = "C++ is not for the faint of heart"; std::istringstream stream(text); std::string word; std::vector<std::string> words; while (stream >> word) { words.push_back(word); std::cout << "Word: " << word << std::endl; } std::cout << "Total words: " << words.size() << std::endl; return 0;}


الإيجابيات: كود نظيف، لا مؤشرات خام، إدارة تلقائية للذاكرة. يعمل مع أي فواصل مسافات (علامات تبويب، أسطر جديدة).



السلبيات: أبطأ من الطرق اليدوية بسبب إنشاء التيار. غير مناسب للفواصل المخصصة (فقط الأحرف البيضاء).



متى تستخدم: عندما تكون سهولة القراءة أهم من السرعة. مثالي للأمثلة التعليمية والنماذج الأولية.



الطريقة رقم 2: السريعة والخطيرة — std::strtok



إرث من لغة C لا يزال موجودًا في بيئات الإنتاج. يقوم strtok بتعديل السلسلة النصية الأصلية (يدرج أحرفًا فارغة) ويستخدم مخزنًا مؤقتًا ثابتًا.



#include <iostream>#include <cstring>#include <vector>

int main() { char text[] = "Fast but dangerous — handle with care"; std::vector<char*> words; char* token = std::strtok(text, " "); while (token != nullptr) { words.push_back(token); std::cout << "Word: " << token << std::endl; token = std::strtok(nullptr, " "); } std::cout << "Total words: " << words.size() << std::endl; return 0;}


الإيجابيات: سريع جدًا (يعمل على مستوى سلاسل C). يسمح بتعيين أي مجموعة من الفواصل.



السلبيات: غير آمن للخيوط، يدمر السلسلة النصية الأصلية، يعمل فقط مع char* وليس std::string. من السهل الحصول على سلوك غير محدد.



متى تستخدم: فقط في الحلقات الساخنة حيث كل نانوثانية مهمة، وتكون متأكدًا من أحادية الخيط. في C++ الحديثة، من الأفضل تجنبها.



الطريقة رقم 3: التكرار اليدوي — std::string::find و substr



أحيانًا تحتاج إلى تحكم كامل. التكرار اليدوي يوفر مرونة ولا يتطلب مكتبات إضافية.



#include <iostream>#include <string>#include <vector>

std::vector<std::string> splitManual(const std::string& text, char delimiter = ' ') { std::vector<std::string> tokens; size_t start = 0; size_t end = text.find(delimiter);

المدونات

توصيات الكتب