درخواست:پیاده سازی تابع strtok

mhabat

Member
با سلام و فرارسیدن سال نو رو به همه تبریکــــــــ می گم. لطفا اگه میشه نحوه پیاده سازی تابع strtokرو با یک تمرین بنویسید.
خیلی ممنون
بدرود
 

the_king

مدیرکل انجمن
با سلام و فرارسیدن سال نو رو به همه تبریکــــــــ می گم. لطفا اگه میشه نحوه پیاده سازی تابع strtokرو با یک تمرین بنویسید.
خیلی ممنون
بدرود

تابع strtok دو پارامتر ورودی رشته ای داره :
پارامتر اول رشته ای است که قرار پردازش و تکه تکه بشه. اگر پارامتر اول null باشه، تابع تکه تکه شدن رشته ای که
دفعه پیش بهش داده شده رو ادامه میده.
پارامتر دوم رشته ای از کاراکتر هایی است که به عنوان جداساز رشته قابل قبول هستند.

تابع اشاره گری رو بر می گردونه، اگر تکه جدیدی از رشته باقی مونده باشه، موقعیت شروع آن تکه رو بر می گردونه
و اگر رشته بطور کامل تکه تکه شده و تکه جدیدی نمونده، null رو بر می گردونه.

کد:
#include <iostream.h>
#include <conio.h>

char* start = 0;

char* strtok(char* s, char* d)
{
    int i;
    char *t;
    if (s)
    {
        start = s;
    }
    while (*start)
    {
        for (i = 0; d[i]; i++)
            if (d[i] == *start)
                break;
        if (!d[i])
            break;
        start++;
    }
    if (*start)
    {
        for (t = start; *t; t++)
        {
            for (i = 0; d[i]; i++)
                if (d[i] == *t)
                {
                    *t = 0;
                    break;
                }
            if (d[i])
            {
                break;
            }
        }
        return start++;
    }
    return 0;
}

int main()
{
    char text[] = "-abcd - ef gh-ijkl-";
    char *t = strtok(text, " -");
    while (t)
    {
        cout << '[' << t << ']' << endl;
        t = strtok(0, " -");
    }
    getch();
    return 0;
}
 

mhabat

Member
سلام وتشکر از سورس خوبتون.اگه میشه قسمت های مربوط به عملگر های به کار رفته رو توضیح بدین.
(در سورس های دیگه یی هم که به این شکل از عملگر ها استفاده ده مشکل دارم)
عذر می خوام اما ما میایم رشته رو تکه تکه می کنیم خوب این کار چه خوبی داره؟
خیلی ممنون
بدرود
 

the_king

مدیرکل انجمن
سلام وتشکر از سورس خوبتون.اگه میشه قسمت های مربوط به عملگر های به کار رفته رو توضیح بدین.
(در سورس های دیگه یی هم که به این شکل از عملگر ها استفاده ده مشکل دارم)
دقیقا منظورتون کدوم عملگر ها است، یک سطر کد مثال بزنید.

عذر می خوام اما ما میایم رشته رو تکه تکه می کنیم خوب این کار چه خوبی داره؟
خیلی ممنون
بدرود
بستگی به مورد اش داره، همیشه مفید نیست، ممکنه در یک برنامه لازم بشه که رشته بر اساس یک کاراکتر
جدا کننده ای تقسیم بشه، strtok یک تابع خاص ئه و کاربرد های محدودی داره.
 

mhabat

Member
سلام.
کد:
if (s)
کد:
 while (*start)
کد:
for (t = start; *t; t++)
این قمست:
کد:
 if (d[i] == *t)
منظورش اینه که مقداری که اشاره گرtبه آن نسبت داده شده برابرdeباشه؟(شرطifمنظورم بود)
خیلی ممنون
بــــدرود
 

the_king

مدیرکل انجمن
سلام.
کد:
if (s)
کد:
 while (*start)
کد:
for (t = start; *t; t++)
این قمست:
کد:
 if (d[i] == *t)
منظورش اینه که مقداری که اشاره گرtبه آن نسبت داده شده برابرdeباشه؟(شرطifمنظورم بود)
خیلی ممنون
بــــدرود


اونجا هایی که با عبارت condition مشخص می کنم جاهایی هستند که یک عبارت نوشته میشه که یا باید true باشه
و یا false
کد:
if ([COLOR="Blue"]condition[/COLOR])
کد:
while ([COLOR="Blue"]condition[/COLOR])
در زبان ++C / C مقدار 0 همان false و هر مقدار غیر صفر true محسوب میشه، به همین جهت شرط زیر
وقتی برقراره که مقدار s هر مقداری بجز 0 (0 همان null ئه) باشه :
کد:
if (s)

متغیر start از نوع *char است، یعنی اشاره گری که به یک char اشاره می کنه. اگر شما جایی عبارت start
رو به تنهایی بنویسید، آدرس حافظه ای رو بدست می آورید که start ذخیره اش کرده.
پس شرط زیر زمانی برقرار است که start برابر 0 نباشه یا درواقع null نباشه :
کد:
while (start)

اما وقتی شما قبل از اسم یک اشاره گر * رو می نویسید، مثلا start* ، آنوقت همون مقداری که بهش اشاره می کنه
رو بدست می آورید، نه آدرس حافظه. مثلا مقدار همان کاراکتری که start بهش اشاره می کنه رو بدست می آورید.
پس شرط زیر زمانی برقرار است که کاراکتری که start بهش اشاره می کنه 0 نباشه، یعنی کاراکتر null
(کاراکتر انتهای رشته) نباشه :
کد:
while (*start)

متغیر t یک *char است، یعنی اشاره گری که به یک کاراکتر اشاره می کنه. d هم یک آرایه از کاراکتر ها است
و [d[i یکی از کاراکتر های این آرایه است. پس شرط زیر زمانی برقرار است که کاراکتری که t بهش اشاره می کنه
با کاراکتری که در خانه i ام آرایه d قرار داره برابر باشه :
کد:
if (d[i] == *t)
 

جدیدترین ارسال ها

بالا