الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Split to Array

مغلق
بدأه راكان الحنيطي في 30 أكتوبر 2004 · 7 رد · 564 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

خلال بحثي على جووجل وجدت دالة اسمها strtok و التي تقوم بفصل الجملة الى عدة كلمات حسب الحرف الفاصل الذي تختاره

مثلا هذا الكود:

char* MyName = "Rakan Alhneiti";
char* part = strtok(MyName," "); //will split myname from spaces
while(part != NULL)
{
cout << part << endl;
part = strtok(NULL,"");
}

سينتج

Rakan
Alhneiti

لكن المشكلة اني حاولت ان اقوم بعمل function اسمه Split مثل الذي في الفجوال بيسك يقوم بفصل الكلمات باستعمال هذه الدالة و من ثم ارجاع مصفوفة الكلمات لكني لم انجح فيها. و ذلك لاني لا اعرف كيف اجد عدد الكلمات في الجملة و من ثم عمل مصفوفة الكلمات بالعدد المطلوب

هل هناك طريقة في السي++ تمكنك من معرفة عدد الكلمات في جملة او معرفة كم مرة تكرر حرف معين في جملة؟

اذا لم يوجد اي من هذا فهل يوجد اي طريقة لعمل ما اريد؟

و شكرا

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#2

في هذه الحال عليك بال linklist لتضيف اليها كما تريد دون القلق بشأن حجم المصفوفة ,,

أو يمكنك التحايل على ذلك بكتابة مصفوفة كالفيكتور Vector ذكية تزيد حجمها كل مااقترب من النهاية .

بهذه الطريقة لن تقلق بشأن الحجم أبدا ,, وكل ماعليك هو اضافة الكلمات كما تريد ,,

في مكتبة STL القياسية يوجد دعم لل Vector وكل مايخطر على بالك ,, لكني لم أعتمد عليها يوما قط ,, ففي كل مرة أود الاعتماد على فئة جاهزة من ال STL أقول ماذا لو لم يكن فيها الميزة الفلانية !!؟ وأبدأ بكتابة فئتي الخاصة .

ال Vector كتبته قبلا ويسمى بال Array أيضا عند أهل الdataStructure لكن أضعته حاليا .

عموما في دروس الفئات التي كتبتها قبلا ,, في تطوير الفئة Array وصلت مرحلة كتبت فيها عن زيادة الحجم بصورة ديناميكية دون التأثير على المحتوى ,, وهي هنا في الرابط :

/index.php?showtopic=36274

اذا لم تجد مايفيد ,, تعال مرة أخرى وسأوضح أكثر :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

الكلام الذي في الأعلى يبدو كهرطقة لأني فهمت شيئا آخر ..

المهم لاأعرف بوجودة دالة جاهزة أم لا ,, لكن يمكنك كتابتها بسرعة ,,

فقط اقرأ مصفوفة الحروف وابحث عن عدد الخانات " " ,, وهي حجم المصفوفة الجديدة فقط ,,

ويمكنك كتابة دالة ال strtok هذه بسهولة لو اتبعت هذه الطريقة .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#4

السلام عليكم

اشكرك اخي هيثم على الوصلة و قد قرأتها و كتبت هذا الكود

#include <iostream>
using namespace std;
class Array
{
public:
	void SetSize(int Size);
	char* GetData(int Index);
	void AddData(char* Data);
	Array(int Size)
	{
  CurrIndex = 0;
  m_Size = Size;
  m_Data = new char[Size];
	}
	~Array()
	{
  delete []m_Data;
	}

private:
	char* m_Data;
	int m_Size;
	int CurrIndex;
};

void Array::SetSize(int Size)
{
	char* tmp = m_Data;
	m_Data = new char[Size];
	m_Data = tmp;
}
void Array::AddData(char* Data)
{
	m_Data[CurrIndex] = *Data;
	if(CurrIndex == m_Size)
	{
  CurrIndex = 0;
	}
	else
	{
  CurrIndex++;
	}
}
char* Array::GetData(int Index)
{
	return &m_Data[Index];
}

void main()
{
	Array Ar(5);
	Ar.AddData("Hello");
	cout << *Ar.GetData(0) << endl;
	return;
}

و عندما انفذه يطلع اول حرف من كلمة Hello و هو H

H
Press any key to continue.

اتوقع انه يأخذ اول حرف فقط علما باني عملت char* و هو Pointer to character الذي سيسمح لي بعمل dynamic string ... اتوقع اني سهيت عن شيء ما ممكن ان تراه انت في الكود

سلام

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#5

حاولت في الكود لكن لم اعثر على اي شيء :s

خصوصا اني استعمل ال Pointer to char و المفروض انه يأخذ اي string مهما كان طوله.

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#6

ياهلا براكان :

خذ الكود :

// arabteam.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

//#include <iostream>
using namespace std;
class Array
{
public:
void SetSize(int Size);
char* GetData(int Index);
void AddData(char* Data);
Array(int Size)
{
 CurrIndex = 0;
 m_Size = Size;
 m_Data = new char[Size];
}
~Array()
{
 delete []m_Data;
}

private:
char* m_Data;
int m_Size;
int CurrIndex;
};

void Array::SetSize(int Size)
{
char* tmp = m_Data;
m_Data = new char[Size];
m_Data = tmp;
}
void Array::AddData(char* Data)
{
strcpy(&m_Data[CurrIndex] , Data);
if(CurrIndex == m_Size)
{
 CurrIndex = 0;
}
else
{
 CurrIndex++;
}
}
char* Array::GetData(int Index)
{
return &m_Data[Index];
}




///////////////////////////////////////
void main()
{
Array Ar(5);
Ar.AddData("Hello");
cout << Ar.GetData(0) << endl;

cin.get();

return;
}

لاحظ للدالة strcpy استخدمتها في الدالة Add Data لتخزين البيانات بدلا من المساواة العادية ,,

الموضوع تحدثت عنه قبلا في مكان ما ,, ولدينا كارثة هنا في المنتدى بأننا لانستطيع أن نفهرس المواضيع بشكل مناسب ,, ويبدو أننا نحتاج لمشرف إضافي على السي++ لأن القسم كبير جدا .

المهم لاأذكر خلاصة ماقلت سوى أن حجم المتغير من النوع char أكبر من عنوانه ,, حيث الحجم بايت وحجم العنوان 4 بايت .

سؤال هل أنا من كتب هذا الكود ؟ أم عدلت عليه ؟ لأني لاأذكر صراحة .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

انا اخذت درسك في ال OOP و من ثم قمت بفهم الكود و كتابته من جديد لانه المثال الذي كتبته انت كان مع ال int اما الكود الذي كتبته انا فكان مع ال character

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#8

عقدتني المسألة :(

الان ما فعلته انه وضعت الكود الذي يفعله ال SetSize الذي كتبه الاخ HGB في درسه لل OOP داخل كود ال AddData function لكن هناك خطأ ما يقول

Debug Error!
Program "F:\Sources....."
Damage after normal block(#44) at 04x00....
Press Retry to debug the application

و عندكا وضعت تعليق في ال main على استدعاء دالة ال Add Data عمل بصورة طبيعية...

void main()
{
Array Ar;
Ar.AddData("Hello");
Ar.AddData("World");
cout << Ar.GetData(0) << endl;
cout << Ar.GetData(1) << endl;
return;
}

void Array::AddData(char* Data)
{
	m_CurrIndex++;
	char* Old = m_Data;
	m_Data = new char[1];
	m_Data = Old;
	strcpy(&m_Data[m_CurrIndex] , Data);
}

لا اعرف ما الحل لكن يبدو ان المشكلة موجودة في ال

char* Old = m_Data;

ما الحل؟

function.zip

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

هذا الموضوع مغلق.

مواضيع مشابهة