نمایش نتایج 1 تا 6 از 6

نام تاپیک: اشاره گری از رشته ها

  1. #1
    کاربر دائمی آواتار emadfa
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    رشت
    پست
    193

    اشاره گری از رشته ها

    ابتدا سوالم را می پرسم و سپس کد خودم رو می زارم ببینید.
    در قسمتی از برنامم یک رشته ساختم از نوع 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;
    }
    آخرین ویرایش به وسیله emadfa : جمعه 18 تیر 1389 در 20:13 عصر

  2. #2
    کاربر تازه وارد آواتار a.gh.n
    تاریخ عضویت
    شهریور 1386
    سن
    34
    پست
    40

    نقل قول: اشاره گری از رشته ها

    سورس کامل می ذاشتید بشه اجرا کرد ... data type ها هم که مشخص نیست... این طوری هست؟

    string oneStr;
    char *Array;

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

  3. #3
    کاربر دائمی آواتار emadfa
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    رشت
    پست
    193

    نقل قول: اشاره گری از رشته ها

    سلام دوست من!
    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 )

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

  4. #4
    کاربر دائمی آواتار mohsensaghafi
    تاریخ عضویت
    اردیبهشت 1386
    محل زندگی
    و نپرسیم کجاییم. بو کنیم اطلسی تازه بیمارستان را
    پست
    338

    نقل قول: اشاره گری از رشته ها

    سلام دوست عزیز.
    یه سرچ در مورد تابع strtoken بکن. فکر کنم کارت رو راه بندازه. این رشته رو بصورت token با یه رشته جدا کننده برات بر می گردونه.
    سرچش ضرر نداره.
    یا علی!

  5. #5
    کاربر دائمی آواتار PC2st
    تاریخ عضویت
    آذر 1385
    محل زندگی
    کرمانشاه
    سن
    38
    پست
    1,491

    نقل قول: اشاره گری از رشته ها

    کدهای شما شاید بخاطر ادغام روش ++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 هم کاربرد دارد، باید برای گرفتن کلمات، این تابع را چند بار صدا بزنید.

  6. #6
    کاربر تازه وارد آواتار a.gh.n
    تاریخ عضویت
    شهریور 1386
    سن
    34
    پست
    40

    نقل قول: اشاره گری از رشته ها

    ا... تو فایل هدر من 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 بهینه تر هم خواهد شد.
    آخرین ویرایش به وسیله a.gh.n : جمعه 18 تیر 1389 در 23:32 عصر دلیل: پست قبلی

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •