Mohssen A Mohssen نشر 20 نوفمبر 2021 أرسل تقرير نشر 20 نوفمبر 2021 لدي نص كالتالي: "One Two Three Four" كيف يمكنني أن أقوم بتقسمه من خلال المسافات بين الكلمات وطباعة كل كلمة على حدى. 3 اقتباس
4 سامح أشرف نشر 20 نوفمبر 2021 أرسل تقرير نشر 20 نوفمبر 2021 في البداية تحتاج إلى تخزين النص في متغير من نوع string: #include <iostream> #include <string> int main() { std::string sentence = "One Two Three Four"; return 0; } بعد ذلك ستحتاج إلى عمل string stream من خلال التابع istringstream الموجود في المكتبة sstream: #include <iostream> #include <string> // لإستخدام الكائن string #include <sstream> // لإستخدام الكائن istringstream int main() { std::string sentence = "One Two Three Four"; std::istringstream iss(sentence); return 0; } الآن يمكن إستخدام التابع copy الموجود في المكتبة sstream أيضًا لطباعة كل كلمة من النص عبر التابع cout #include <iostream> #include <string> #include <sstream> int main() { std::string sentence = "One Two Three Four"; std::istringstream iss(sentence); std::copy( std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::ostream_iterator<std::string>(std::cout, "\n") ); return 0 } بهذا الشكل سوف يكون الناتج كالتالي: One Two Three Four 2 اقتباس
1 Wael Aljamal نشر 20 نوفمبر 2021 أرسل تقرير نشر 20 نوفمبر 2021 يمكننا كتابة دالة تقوم بالمرور على السلسلة النصية، وتجميع الحروف المتتالية (ماعدا الفراغات) وإضافتها لمصفوفة الإجابة والتي من الممكن أن تكون مصفوفة Vector بنمط String // الناتج وهو مصفوفة سلاسل السلسلة النصية void split_string(string text,vector<string>& words) { int i=0; // بداية السلسة char ch; // محرف مؤقت للقراءة string word; // سلسلة لتجميع الأحرف المتتالية التي تشكل سلسلة نصية // المرور على السلسلة while(ch=text[i++]) { if (isspace(ch)) // في حال وجدنا فراغ { if (!word.empty()) // إن كان لدينا كلمة { words.push_back(word); // نضيفها للإجابة } word = ""; // إعادة تهيئة المتغير المؤقت للكلمة } else // يوجد حرف { word += ch; // نضيف الحرف للكلمة الحالية } } if (!word.empty()) // بعد الانتهاء من الحلقة إن بقي لدينا أحرف ضمن السلسلة { words.push_back(word); // نضيف آخر كلمة } } لاحظ وجود شرط لتجاوز الفراغات المتتالية، حيث لا نضيف فراغ للمتغير الذي نقوم فيه بتجميع المحارف المتتالية 1 اقتباس
0 Ali Haidar Ahmad نشر 20 نوفمبر 2021 أرسل تقرير نشر 20 نوفمبر 2021 (معدل) الطريقة1: نقوم بتعريف و تهيئة متغير يمثل كلمة على فارغ (سنسميه word )، ثم نمر على كل المحارف في السلسلة ، ونختبر فيما إذا كان المحرف الحالي عبارة عن مسافة فارغة، فهذا يعني أننا وصلنا لنهاية الكلمة، فنطبعها، ونقوم بضبط word على ""، وإلا فإننا نضيف المحرف الحالي إلى word. #include <iostream> using namespace std; void split(string str) { string word = ""; for (auto c : str) { if (c == ' ') { cout << word << endl; word = ""; } else { word = word + c; } } cout << word << endl; } int main() { string str = "One Two Three Four"; split(str); return 0; } /* One Two Three Four */ الطريقة2: من خلال استخدام الدالة strtok. التي لها الشكل التالي: strtok(char* str, const char* delim); حيث أن الوسيط الأول يمثل السلسلة التي نريد الحصول على الرموز منها. والثاني حرف التحديد ، أي الحرف الذي يفصل بين الرموز. وتستخدم هذه الدالة للقيام بعملية tokenizing (أي فصل النصوص إلى وحدات محرفية أو كلمات) بناءاً على delimiter محدد. ويقوم بإرجاع مؤشر إلى ال token التالي إذا كان موجوداً، وإذا لم يكن هناك token تالي موجوداً فإنه يقوم بإرجاع NULL. وبالتالي للحصول على جميع ال tokens (في حالتنا الكلمات)، ستكمن الفكرة في استدعاء هذه الدالة في حلقة. #include <bits/stdc++.h> using namespace std; void split(char str[]) { // token تعيد أول char *token = strtok(str, " "); // str[] استمر في طباعة الكلمات طالما يوجد أحد المحددات في while (token != NULL) { printf("%s\n", token); // طباعة الكلمة والنزول سطر token = strtok(NULL, " "); } } int main() { char str[] = "One Two Three Four"; split(str); return 0; } /* One Two Three Four */ تم التعديل في 20 نوفمبر 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
السؤال
Mohssen A Mohssen
لدي نص كالتالي:
"One Two Three Four"
كيف يمكنني أن أقوم بتقسمه من خلال المسافات بين الكلمات وطباعة كل كلمة على حدى.
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.