PDA

View Full Version : سوال: طول رشته های اشاره گری؟



moha//\\//\\ad
سه شنبه 28 مرداد 1393, 19:04 عصر
ما وقتی یه رشته رو تعریف میکنیم به دو شکل زیر

char str1[];
char *str2;


اول اینکه تفاوت اینها در قرارگیری در حافظه چیه؟ و کجاها نیازه که از نوع اشاره گری استفاده کنیم
دوم اینکه اندازه ی رشته ی str2 چقدره
یعنی اینکه ما اگه یه رشته مثل این رو تعریف کنیم و در طول برنامه کاربر هر سری مقداری کنه اون رو ، از کجا بدونیم طول اولیه این رشته چقدره؟ بی نهایت که نمیشه

omid_kma
سه شنبه 28 مرداد 1393, 20:16 عصر
اولی با .sizeof()
دومی اگر آخرش کارکتر null وجود داره با تابع strlen .
مورد اول یک آرایه با سایز ثابت هست داخل فضای stack قرار می گیره
دومی اگر با new حافظه بگیرید داخل heap قرار میگیره در غیر این صورت اگر زمان تعریف مقدار بدید char *str2="qwe"lداخل stack قرار میگیره با این تفاوت که این جا str2 به یک حافظه "فقط خواندنی " اشاره می کنه . ولی char a[]="qwe"l قابل تغییر هم هست .

moha//\\//\\ad
سه شنبه 28 مرداد 1393, 23:38 عصر
ممنون حالا این ارایه و اشاره گر رشته چه محدودیتی داره؟ تا چند کاراکتر میشه ذخیره کرد؟
ما توابع زیادی برای ورودی خروجی رشته ها داریم توابع استاندارد کدومه و اینکه با تعریف رشته به این دو حالت مختلف ایا توابع گرفتن رشته هم متفاوت میشه یا فرقی نداره؟

omid_kma
چهارشنبه 29 مرداد 1393, 01:47 صبح
اندازه بیشترین عددی که میشه با size_t نشون داد میشه با char* جافظه گرفت که خب این قدر بزرگ هست که میشه گفت محدودیتی برای ذخیره کاراکتر وجود نداره چیزی که شما رو محدود می کنه مقدار رم ای هست که دارید .
حداکثر اندازه size_t رو میشه با این کد فهمید

#include <iostream>
#include <numeric>
int main()
{
std::cout<<std::numeric_limits<size_t>::max();
}


در مورد سوال دوم نه برای توابع ورودی و خروجی تفاوتی وجود نداره .

توابع استاندارد رو میتونید از مراجع آنلاین پیدا کنید .

http://en.cppreference.com/w/cpp/string
http://en.cppreference.com/w/c/string/byte

iut.ali
چهارشنبه 29 مرداد 1393, 01:53 صبح
منظورت از محدودیت چیه تو میتونی رشته رو به هر اندازه ای که بخوای new کنی یا آرایه رو تو stack هر چقدر میخوای بزرگ بگیری
توابعی که واسه رشته ها استفاده میشه هر کدوم به شکل خاصی هستند مثلا اگه با cin رشته رو گرفتی و فاصله وارد کردی ذخیره میشه ولی با gets میتونی فاصله هم وارد کنی پیشنهاد من بهت اینه که از کتابخونه ی String استفاده کنی و توابعشو یاد بگیری و وقت خودتو صرف این جوری کار کردن با رشته ها نکنی کلی تابع واسه String در نظر گرفته شده که کارا رو راحت میکنه البته بیشترش رو همینطوری هم میتونی استفاده کنی ولی String نیازی به وارد کردن حافظه ی مورد نیاز نداری و ...

moha//\\//\\ad
چهارشنبه 29 مرداد 1393, 05:05 صبح
اهان پس در واقع وقتی یه رشته رو تعریف میکنیم محدودیتی در استفاده از تابع خاص برای گرفتن اون رشته نداریم مگر اینکه نوعش wide باشه
حالا یه چیز دیگه اینکه من دیدم زمانی که از اشاره گر برای تعریف رشته استفاده شده به دنبالش با new حافظه براش تخصیص داده شده در حالی که در برخی کدها اینجور نبوده و طرف بدون تخصیص مقدار دهی کرده! چرا؟

مسعود اقدسی فام
چهارشنبه 29 مرداد 1393, 11:16 صبح
اهان پس در واقع وقتی یه رشته رو تعریف میکنیم محدودیتی در استفاده از تابع خاص برای گرفتن اون رشته نداریم مگر اینکه نوعش wide باشه
حالا یه چیز دیگه اینکه من دیدم زمانی که از اشاره گر برای تعریف رشته استفاده شده به دنبالش با new حافظه براش تخصیص داده شده در حالی که در برخی کدها اینجور نبوده و طرف بدون تخصیص مقدار دهی کرده! چرا؟

وقتی اشاره‌گر به یه رشته تعریف می‌کنید، فقط اشاره‌گر تعریف می‌کنید! یعنی متغیری هست که آدرس شروع یه رشته رو می‌تونه داخل خودش نگه داره. حالا برای ذخیره‌ی یه رشته، باید به کمک new حافظه بگیرید و اطلاعات رو ذخیره کنید. اگه مثلا str2 = str1 نوشته می‌شه، صرفا آدرس شروع رشته‌ی str1 (که قبلا یه جای دیگه به هر نحوی فضا براش تعریف شده) داخل str2 هم قرار می‌گیره. از این دستور به بعد str1 و str2 به یه محل حافظه اشاره می‌کنن و تغییرشون فقط روی یه محل حافظه تاثیر می‌ذاره.