اذهب إلى المحتوى
  • 1

تقسيم نص إلى كلمات وطباعة كل كلمة في ++C

Mohssen A Mohssen

السؤال

Recommended Posts

  • 4

في البداية تحتاج إلى تخزين النص في متغير من نوع 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

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

يمكننا كتابة دالة تقوم بالمرور على السلسلة النصية، وتجميع الحروف المتتالية (ماعدا الفراغات) وإضافتها لمصفوفة الإجابة والتي من الممكن أن تكون مصفوفة 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); // نضيف آخر كلمة 
  }
}

لاحظ وجود شرط لتجاوز الفراغات المتتالية، حيث لا نضيف فراغ للمتغير الذي نقوم فيه بتجميع المحارف المتتالية

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الطريقة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
*/

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...