PDA

View Full Version : اشاره گری از رشته ها



emadfa
جمعه 18 تیر 1389, 20:01 عصر
ابتدا سوالم را می پرسم و سپس کد خودم رو می زارم ببینید.
در قسمتی از برنامم یک رشته ساختم از نوع string که می تونه شامل صدها کلمه باشه! ( چون این رشته اطلاعات یک فایله! ) حالا نیاز دارم که تعداد کلمات این رشته را در یک عدد و همه کلمات این رشته رو در یک اشاره گر رشته ذخیره کنم. ( چون تعداد کلمات معلوم نیست. ) فرض می کنیم ملاک تشخیص هر کلمه فقط یک Space باشه. حالا می مخوام با تشخیص هر Space حروق قبل از این Space تا Space قبلی در قسمتی از اشاره گر ذخیره بشه. با این کار همه کلمات یک متن رو جدا کرده و در یک اشاره گر ذخیره کرده و می تونم به اون ها دسترسی داشته باشم. برای فهمیدن تعداد کلمات هم الگوریتم رو نوشتم. البته برای ذخیره کردن خود کلمات چیزی که گفتم الگوریتم خودمه. اگه الگوریتم بهتری دارید لطفا بگید.
برنامه ای که نوشتم در هنگام اجرا crash میشه که دلیلش تابع CountWord هست. این برنامه رو با کامپایلر Qt نوشتم. لطفا کمکم کنید.
فایل Process_Core.h

#ifndef PROCESS_CORE_H
#define PROCESS_CORE_H
#include <string>
using namespace std;
class Process_Core
{
public:
Process_Core(string);
string getString();
int CountWord();
private:
string myStr;
const char *Array;
int num;
string *nor;
string oneStr;

};

#endif // PROCESS_CORE_H



فایل Process_Core.cpp

#include "process_core.h"
Process_Core::Process_Core(string str)
{
myStr = str;
}
string Process_Core::getString()
{
return myStr;
}
int Process_Core::CountWord()
{
num = 0;
oneStr = "";
int m;
Array = myStr.c_str();
for(int i = 0 ; Array[i] ; i++)
{
if(Array[i] == ' ' && Array[i-1] != ' ')
{
num++;
if(num == 1)
m = i + 1;
else
{
int n = i - 1;
for(int j = m ; m <= n ; j++ )
oneStr += Array[j];
*nor = oneStr;
*nor++;
int m = i + 1;
}
}
}
num++;
return num;
}

a.gh.n
جمعه 18 تیر 1389, 20:56 عصر
سورس کامل می ذاشتید بشه اجرا کرد ... data type ها هم که مشخص نیست... این طوری هست؟


string oneStr;
char *Array;

nor هم نفهمیدم واسه چی هست و کجا ازش استفاده کردید. به هر حال یه مشکل که همون assignment برای Array هست. اگه منظورت اینه که string کپی شه باید از چیزی مثل memcpy یا strcpy استفاده کنی.

emadfa
جمعه 18 تیر 1389, 21:55 عصر
سلام دوست من!
data types مشخصه! یک سری از متغیرها و ثوابت در قسمت private در header file تعریف شدند. یک سری هم در داخل توابع.
nor هم همون اشاره گری از رشته هاست. که قراره همه کلمات این رشته توش ذخیره شه و پس از اجرای تابع CountWord دارای مقداره!

در مورد قرار دادن کل برنامه!
قسمت هایی که گذاشتم بخش کوچکی از برنامه منه! و کل برنامه شامل فایل های متععدی است. برای اجرا می تونید در فایل main یک شی از این کلاس درست کنید با مقدار سازنده شامل یک رشته ( که مثلا یک جمله باشه! )

#include <iostream>
using namespace std;

int main()
{
Process_Core myStr("This is my problem!";
cout << myStr.CountWord << endl;
return 0;
}

البته این کلاس هنوز جای کار داره! مثلا نیاز به یک تابع display دارم برای این که تک تک کلمات رو از اشاره گر nor نمایش بدم! ( البته بعد از اجرای تابع CountWord )

ممنون میشم کمک کنید!

mohsensaghafi
جمعه 18 تیر 1389, 22:42 عصر
سلام دوست عزیز.
یه سرچ در مورد تابع strtoken بکن. فکر کنم کارت رو راه بندازه. این رشته رو بصورت token با یه رشته جدا کننده برات بر می گردونه.
سرچش ضرر نداره.
یا علی!

PC2st
جمعه 18 تیر 1389, 23:16 عصر
کدهای شما شاید بخاطر ادغام روش ++C و C اینطور پیچیده شده...

من پیشنهاد می‌کنم این روش را (++C خالص):

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

using std::string;
using std::vector;

int main()
{
std::string my_str ("This is my problem! oh... it was.");
vector <string> tokens;

int i (0);
int end_pos;
while (end_pos != string::npos)
{
end_pos = my_str.find (' ', i);
tokens.push_back (my_str.substr (i, end_pos - i));
i = end_pos + 1;
}

for (vector <string>::const_iterator iter = tokens.begin (); iter != tokens.end (); ++iter)
{
std::cout << *iter << std::endl;
}
}یا اینکه از همان بطور کلی بر روی آرایه و اشاره‌گرها مانور دهید. همانطور که دوست عزیز در پاسخ قبل گفتند، می‌توانید از strtok هم استفاده کنید که برای زبان C هم کاربرد دارد، باید برای گرفتن کلمات، این تابع را چند بار صدا بزنید.

a.gh.n
جمعه 18 تیر 1389, 23:26 عصر
ا... تو فایل هدر من oneStr و nor و Array نبود. احتمالا قبل از ویرایش فایل ناقص بود. این برنامه ی اصلاح شده شما:


#include "string.h"
#include <iostream>
using namespace std;

Process_Core::Process_Core(string str)
{
const int MAXWORDS=50;
Array = new char[str.length()+1];
nor = new string[MAXWORDS];
myStr = str;
}
string Process_Core::getString()
{
return myStr;
}
int Process_Core::CountWord()
{
num = 0;
oneStr = "";
int m;

strcpy (Array, myStr.c_str());

for(int i = 1 ; Array[i] ; i++)
{
if(Array[i] == ' ' && Array[i-1] != ' ')
{
num++;
if(num == 1)
m = i + 1;
else
{
int n = i - 1;
for(int j = m ; j <= n ; j++ )
oneStr += Array[j];
*nor = oneStr;
nor++;
int m = i + 1;
}
}
}
num++;
return num;
}

ولی من جات بودم به جای تبدیل به c_str از همون توابع کلاس string و از string_iterator برای حلقه استفاده می کردم.
=====ویرایش=====
من آفلاین داشتم تایپ می کردم که دوستی قبل از من پاسخ داد. همونطور که گفتم استفاده از روش ایشون جالب تره. یا با C کد بزنید یا با Cpp. البته با iterator نسبت به find بهینه تر هم خواهد شد.