ورود

View Full Version : رشته ها در c



__masumeh
جمعه 21 مهر 1391, 21:50 عصر
در کتابهای c نوشته شده که وقتی یک رشته را بصورت آرایه ای از کاراکترها تعریف می کنیم در انتهای رشته کاراکتر 0\ افزوده می شود و در نتیجه باید فضای مورد نیاز رشته مان را یکی بیشتر در نظر بگیریم در صورتیکه من در توربوc تست کردم و دستور زیر را نوشتم و با اینکه طول فضا را 5 کاراکتر در نظر گرفتم از 5 تاش هم تونستم استفاده کنم!!!
char s[5]="salam" خروجی نیز salam را کامل چاپ می کند

مسعود اقدسی فام
جمعه 21 مهر 1391, 22:27 عصر
بله درسته. وقتی شما رشته رو تعریف کردید، یعنی ۵ خانه بهش اختصاص داده شد. این معنیش این نیست که شما اجازه دسترسی به خانه‌های بعدی رو ندارید. اما اون خانه‌ها در اختیار شما نیستن. ممکنه متعلق به متغیر دیگه‌ای باشن. وقتی متغیر مقدارش عوض می‌شه، روی داده‌ی شما می‌نویسه. شما اصلا بنویسید "salam manam". کامپایلر خطایی نمی‌گیره. وقتی می‌خواید چاک کنید هم همینطور. اما حواستون باشه که فقط Salam براش حافظه رزور شده. یعنی اگه بعدش یه کاراکتر تعریف کنید شاید دقیقا بیفته پشت سر این ارایه. اگه این کاراکتر رو p مقدار بدید یهو می‌بینید رشته شد "salampmanam" چرا؟ چون شما ۵ تا رزرو کردید. بقیه رو هر کسی می‌تونه استفاده کنه.

آرایه‌ها رابطه‌ی خیلی نزدیکی با اشاره‌گرها دارن. اگه اون رو مطالعه کنید شاید بهتر متوجه منظورم بشید.

مسعود اقدسی فام
جمعه 21 مهر 1391, 22:33 عصر
همین مثال خودتون وقتی شما نوشید "salam" برنامه ۵ خونه رزرو کرده. حروف salam رو قرار داده و بعد هم 0\ رو خونه ششم قرار داده که کنترل دست شما نیست.
خانه‌های حافظه شاید اینطور باشن:

salam_4534dsf4rr43_wfwfwef

که منظور از _ همون 0\ هستش. اگه از این عبارت پرینت بگیرید همون سلام چاپ می‌شه. چون تا 0\ پیش می‌ره.
حالا اگه اونطور که گفتم کاراکتر تعریف شه و مقدارش p باشه، رشته می‌شه:

salamp4534dsf4rr43_wfwfwef

جالا اگه از این عبارت چاپ بگیرید می‌شه:

salamp4534dsf4rr43

__masumeh
یک شنبه 23 مهر 1391, 11:42 صبح
ممنون متوجه شدم فقط بگید چرا خروجی برنامه به صورت زیر است اگر طول هر آرایه را یکی اضافه کنم درست چاپ میشه ولی چرا ؟
char s[3]="ali"
char f[5]="salam"
printf("%s\n%s,s,f)
خروجی
ali2
ali2

مسعود اقدسی فام
یک شنبه 23 مهر 1391, 20:43 عصر
ممنون متوجه شدم فقط بگید چرا خروجی برنامه به صورت زیر است اگر طول هر آرایه را یکی اضافه کنم درست چاپ میشه ولی چرا ؟
char s[3]="ali"
char f[5]="salam"
printf("%s\n%s,s,f)
خروجی
ali2
ali2
این رو بررسی می‌کنم می‌گم اگه فرصتی بود و دوست دیگه‌ای جواب نداد.

فقط خواستم بگم این تعریف بالا بستگی به کامپایلر داره که اصلا قبولش کنه یا نه. مثلا شاید توربو قبول کنه. ولی ویژوال استودیو به طولش گیر می‌ده. یعنی اون خصوصیت جزو خصوصیت زبان نیست. جزو خصوصیت کامپایلر و در واقع استانداردی که براش تعریف کرده هست.

در مسابقات رسمی حتما کامپایلری که برای کامپایل کد استفاده می‌شه برای هر زبان به صورت دقیق با جزئیات مشخص می‌شه، تا کاربر بدونه کدش رو چطور بنویسه که خطای کامپایل نده. من مثلا یه کد رو در محیط VS می‌نویسم و ممکنه حواسم نباشه که فلان استاندارد در کامپایلر ++g که قراره کد رو برای مسابقه کامپایل کنه وجود نداره یا یه جور دیگست. کد رو سیستم خودم خوب اجرا می‌شه. اما وقتی ارسال می‌کنم اصلا کامپایل نمی‌شه! اونوقت باید رفت سراغ خطایی که داده و متوجه تفاوت کار شد.

پس حتما بحث محیط و کامپایلر رو هم دقت کنید.

__masumeh
چهارشنبه 26 مهر 1391, 07:32 صبح
به جواب نرسیدید؟

omidshaman
چهارشنبه 26 مهر 1391, 08:52 صبح
به جواب نرسیدید؟
خوب دوست عزیز دلیلشو ایشون گفتن دیگه!
ببین وقتی شما رشته رو مساوی بلاک های ارایه میزاری این جوری پایان اون استرینگ شما مشخص نیست
البته برای کمپایلر من خروجی این جوری بود که
ali
salamali
دلیلشم واضحه وقتی شما salam رو برابر یک ارایه 5 کاراکتری میزاری این جوری پایانش که همون 0\ باشه مشخص نیست یعنی کمپایلر نمی تونه تشخیص بده که string شما تموم شده پس وقتی از printf استفاده می کنی تا اون جایی که به 0\ برسه نوشتن رو ادامه میده یعنی کاراکتر ها تو حافظه این جورینsalamali_43545f34_ghhjgh البته کاراکتر بعد از ali هم هر لحظه می تونه تغییر کنه و خروجی شما فرق کنه!

__masumeh
پنج شنبه 27 مهر 1391, 19:07 عصر
ببینید من فهمیدم شما چی میگید ولی سوال من در مورد انتهای رشته نیست منظورم اینه که انتهای رشته کاملا منطقی است که معلون نباشد کجا باشه ولی ایتدای رشته که باید درست باشه منظورم اینه که رشته دوم بالاخره باید با salam شروع بشه حالا ممکنه در ادامه آن چیزهای دیگه ای چاپ بشه ولی نه اینکه به جای salam چیز دیگری(ali2)چاپ بشه!!!!!!!

(کامپایلر مورد استفاده من : Turbo c++ 3.0 )

مسعود اقدسی فام
جمعه 28 مهر 1391, 10:07 صبح
اول و آخر عبارت چاپی هم یه n\ اضافه کنید و دوباره اجرا کنید تا خروجی هر اجرا از اونیکی تفکیک بشه. بعد اینجا بنویسید چی خروجی داد.