PDA

View Full Version : نحوه ی استفاده از تابع strtok در ویژال استدیو



hosseinam1370
چهارشنبه 06 اسفند 1393, 16:25 عصر
دوستان کار strtok چیه ؟ با رشته ها چیکار میکنه این؟
تو ویژال استدیو 2012 هم خطا میزنه.
تو نت هم سرچ زدم ولی چیزی دستگیرم نشد.
یه راهنمایی کنید ممنون میشم.

#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
int main ()
{

char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok(str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
system ("pause");
}



با تشکر.

rahnema1
چهارشنبه 06 اسفند 1393, 17:36 عصر
سلام
ما یک یا چند کاراکتر را تعریف می کنیم که مثلا رشته بر اساس اونها تفکیک بشه. اما این تابع رشته را تکه تکه نمی کنه بلکه در هر مرحله که تابع را صدا بزنیم می آد به جای کاراکتر جدا کننده که در رشته پیدا می کنه یک صفر میذاره تا انتهای اون زیررشته را نشون بده و آدرس زیررشته را در pch قرار می ده بنابراین ما آدرس زیر رشته را داریم و انتهای اون هم که صفر قرار گرفته در نتیجه می تونیم اون رشته را چاپ کنیم
در مراحل بعدی که تابع را صدا می زینم پارامتر اول باید NULL باشه تا به ترتیب زیررشته های دیگه را هم پیدا کنیم

hosseinam1370
چهارشنبه 06 اسفند 1393, 23:15 عصر
جناب rahnema1 خیلی ممنون بابت پاسخ گوییتون.
ولی هرچقدر فکر میکنم که NULL رو چطوری ربطش بدم به رشته hossein نمیتونم، مثلا به کد زیر نگاه کنید:

int main( )
{

char hossein[] = "hossein in iran";
char n[] = " ";
char *ptr ,*next;
ptr = strtok_s(hossein , n , &next);
while ( ptr)
{
cout << ptr << endl;
ptr = strtok_s(NULL , n , &next);

}


system("pause");
}

در اینجا ptr داخل حلقه چطور میخاد بفهمه که منظور من جدا کردن رشته hossein هست؟ربطش به NULL چیه؟


حالا به این کد نگاه کنید:

int main( )
{

char hossein[] = "hossein in iran";
char n[] = " ";
char *ptr ,*next;
ptr = strtok_s(hossein , n , &next);
while ( ptr)
{
cout << ptr << endl;
ptr = strtok_s(next , n , &next);

}

system("pause");
}

در اینجا مثلا میشه گفت در ptr داخل حلقه ، next اولی دارای آدرس بعدی هست ، و میشه راحت تریسش کرد.

ربط NuLL رو یه زحمت بکشید واضح تر بگید خیلی ممنون میشم.

با تشکر.

rahnema1
پنج شنبه 07 اسفند 1393, 06:23 صبح
منظور شما اینه که در تابع strtok وقتی که ما دفعات بعدی از NULL استفاده می کنیم چه طور می فهمه از چه رشته ای استفاده می کرده
می تونه بستگی به پیاده سازی کتابخانه استاندارد داشته باشه دربعضی پیاده سازی ها مشخصات رشته بعدی در یک متغیر گلوبال که توسط کتابخانه تعریف شده ممکنه ذخیره بشه
یا مثلا در یک استراکت که اطلاعات thread جاری را نگه می داره ذخیره بشه
اما قضیه strtok_s کمی فرق می کنه اطلاعات کافی در next ذخیره میشه تا دفعات بعدی بتونه زیررشته را تشخیص بده

hosseinam1370
پنج شنبه 07 اسفند 1393, 09:56 صبح
ممنون از شما.
فقط ببینید به نظر شما منظور دوتا جمله رو درست میگم یا نه:

ptr = strtok_s(hossein , n , &next);

در اینجا منظور اینه که ، در رشته hossein به اولین کاراکتری رسیدی که دارای نشانه هایی از n هست ، اون نشانه رو پاک کن و جاش 0 بزار و آدرس کاراکتر بعدی اون رو هم برگردون به ptr و هم بده به next.


ptr = strtok_s(NULL , n , &next);

در اینجا منظور اینه که ، در رشته NULL به اولین کاراکتری رسیدی که دارای نشانه هایی از n هست ، اون نشانه رو پاک کن و جاش 0 بزار و آدرس کاراکتر بعدی اون رو هم برگردون به ptr و هم بده به next.


منظورم اینه که اینجا NULL منطقی نیست و چرا باید باشه؟!!


با تشکر .

rahnema1
پنج شنبه 07 اسفند 1393, 13:45 عصر
اولین بار که تابع صدا زده می شه داخل hossein را جستجو می کنه ببینه آیا کاراکتری داخلش پیدا می شه که جزء n نباشه اگر پیدا شد که در واقع کاراکتر ابتدایی اولین زیررشته پیدا شده خواهد بود آدرس اون به ptr داده میشه
اگر چنین کاراکتری پیدا نشه بنابراین به انتهای رشته می رسیم و تابع مقدار null بر می گردونه
سپس این تابع اولین کاراکتر موجود در hossein که همچنین در n قرار داره را می خواد پیدا کنه. اگه پیدا کرد اون کاراکتر برابر 0 میشه بنابراین زیررشته اول به طور کامل مشخص میشه؛ و آدرس رشته بعد از 0 به next داده میشه
اما اگه این کاراکتر جداساز پیدا نشد زیررشته مورد نظر تا انتهای رشته در نظر گرفته می شه و بعدا هم اگه تابع صدا زده بشه دیگه زیر رشته ای وجود نداره که پیدا بشه و جواب null میده

حالا اگه درمراحل بعدی تابع با null صدا زده شد این تابع به رشته ای که داخل next قرار داره مراجعه می کنه نه به رشته null و next به جای hossein قرار می گیره تابع جستجو می کنه به اولین کاراکتری رسید که دارای نشانه هایی از n هست ، اون نشانه رو پاک کرده و جاش 0 می ذاره و و آدرس کاراکتر بعد اون رو هم برمی گردونه به next