PDA

View Full Version : سوال در مورد تابع strtok



deopen
پنج شنبه 28 آذر 1387, 13:52 عصر
سلام, بتازگی با تابع strtok از کتابخانه cstring آشنا شدم, طرز عملکر این تابع برایم مبهم است :



int main() {
char big[]="hi this is test";
char *tok=0;
tok=strtok(big," ");//first word==>hi
cout<<tok<<endl;
//---------------------
tok+=2;//null
cout<<tok<<endl;
//---------------------
tok+=1;//the rest of sentence
cout<<tok;
cin.get();
return 0;
}

کد بالا رو مشاهده کنید, فقط کلمه اول از جمله جدا شده! کد زیر کد صحیح است اما اینجاست که برایم کاملا مبهم است :



int main() {
char big[]="hi this is a test";
char *tok=0;
tok=strtok(big," ");//first word==>hi
while (tok!=NULL) {
cout<<tok<<endl;
tok=strtok(NULL," ");//get nest token
}
cout<<"";
cin.get();
return 0;
}


آرگومان NULL تعیین میکند که strtok باید عمل خود را از hi به بعد انجام دهد, اگر امکان دارد توضیحات بیشتری به من بدید.

Nima_NF
پنج شنبه 28 آذر 1387, 16:34 عصر
عملکرد این تابع به این شکل است که رشته ورودی در آرگومان اول فقط در دفعه اول فراخوانی باید قرار داده شود و در دفعات بعد اگر می خواهیم token بعدی را پیدا کنیم (در مثال شما blank بعدی) باید آن پارامتر را Null قرار دهیم، خودش تشخیص کجا بوده است چون خود تابع یک متغیر استاتیک اختصاص می دهد و در هر مرحله یک null در انتهای همان قسمت قرار می دهد.
در فراخوانی بعدی با null از مکان پیدا شده تا مکان token بعدی را بر می گرداند.
پس وقتی از این تابع استفاده می کنیم به شکل دوم عمل کنید (یعنی در یک حلقه) و فقط هم در همان حلقه فقط یک رشته را با این تابع پردازش کنید و از استفاده همزمان چند مرتبه آن برای رشته های مختلف در همان حلقه پرهیز کنید.

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

deopen
پنج شنبه 28 آذر 1387, 17:36 عصر
دفعات بعد اگر می خواهیم token بعدی را پیدا کنیم (در مثال شما blank بعدی) باید آن پارامتر را Null قرار دهیم

خوب این قرار دادی است, یا منطقی؟! قطعا منطقی نیست و درون تابع شرطی موجود است درسته؟


چون خود تابع یک متغیر استاتیک اختصاص می دهد و در هر مرحله یک null در انتهای همان قسمت قرار می دهد.

درسته من از این اطلاع نداشتم حتی اگر اشاره گر دیگری رو به تابع با آرگومان NULL نسبت دهیم بازهم از مرحله بعد کلمه ی بعد را جدا میکند.

Nima_NF
جمعه 29 آذر 1387, 11:41 صبح
تمامی مواردی که گفتم در اسناد strtok نیز وجود دارد و این به این معنی هست که در تابع به همین شکل تعریف شده اند و همواره باید بر اساس اسناد عمل کنید:
اگر NULL باشد جستجوی دفعه بعد در غیر این صورت جستجو از ابتدا و ...

برای پارامتر اول:



C string to truncate. The contents of this string are modified and broken into smaller strings (tokens).
Alternativelly, a null pointer may be specified, in which case the function continues scanning where a
successful call to the function ended.

deopen
جمعه 29 آذر 1387, 15:50 عصر
متشکرم , کاملا درک کردم .