آخرین مطالب
LINK TABLES
خانه | برنامه‌نویسی | زبان C – رشته‌ها (جلسه ۵)

زبان C – رشته‌ها (جلسه ۵)

خوبید بچه ها؟، نوبت رسید به رشته‌ها که خیلی باهاشون توی زبان C کار می کنیم و طبیعتا باید خوب قواعد کار کردن به رشته ها رو بلد باشید. راستی یادم رفت بهتون سلام کنم. با یه سلام گرم این جلسه را شروع می کنیم. 🙂

 

یادآوری

لطفا قبل از مطالعه این بحث مباحث زیر را مطالعه کنید:

انواع داده در زبان C               اشاره گرهای زبان C               آرایه ها در زبان C

رشته‌

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

در واقع وقتی شما دکمه ای را فشار می دهید برای نمایش آن باید کد مخصوص آن دکمه که متناظر با کاراکتر نوشته شده ی روی آن است به نمایشگر ارسال شود. مثلا با فشردن دکمه حرف a کد ۹۷ برای نمایشگر ارسال می شود. در کیبورد کامپیوتر هم دقیقا چنین وضعیتی وجود دارد. این کاراکترها کنار هم قرار می گیرند و کلمات و جمله ها و متن را می سازند. در واقع دنباله ای از کاراکترها به وجود می آیند. مانند “salam”.

اما در کنار بحث نمایش کاراکتر ها بحث ذخیره سازی آن ها هم اهمیت زیادی دارد. در زبان C برای ذخیره، بازیابی و دست‌کاری متن‌ها (دنباله ای از کاراکترها) از رشته استفاده می شود. رشته نوع جدیدی از داده نیست، بلکه به‌صورت آرایه‌ای از کاراکترها است که آخرین خانه ی آن با صفر پایان می یابد.

در زبان c رشته‌ها باید بین یک زوج علامت double quotes یعنی ” ” قرار گیرد ولی کاراکترها بین یک زوج علامت single quotes یعنی ‘ ‘  قرار می گیرند.

وقتی حرفی یا کاراکتری بین single quotes قرار می گیرد برای کامپایلر به معنی کد اسکلی (ASCII) آن حرف یا کاراکتر است. هم چنین وقتی کلمه یا جمله ای بین double quotes قرار می گیرد، به ازای تک تک کاراکترهای آن کد اسکی معادل آن ها در نظر گرفته می شود.

تعریف

همان طور که گفته شد، رشته آرایه ای از کاراکترها هست. پس برای تعریف رشته باید مانند تعریف آرایه عمل کرد با این تفاوت که نوع رشته فقط می تواند char انتخاب شود. به یک نمونه تعریف و مقداردهی رشته دقت کنید:

  • یک آرایه از نوع کاراکتری (یا همان رشته) با نام str برای ذخیره کلمه”Hello”  با طول ۶ مورد استفاده قرار گرفته است. به نظر شما چرا رشته با طول ۵ استفاده نشده است؟

قوانین

آخرین عضو رشته به کاراکتر تهی ختم می‌شود. کامپایلر زبان C برای تعیین انتهای رشته از کاراکتر خاصی به نام (تهی = null) استفاده می‌کند که با   (۰\ ) (بایتی حاوی هشت بیت صفر و ارزش عددی صفر) مشخص می‌گردد. پس طول رشته را باید یک واحد بیشتر ازآنچه نیاز است تعیین کرد.

در رشته‌ای با طول n (کلمه ای با طول n کاراکتر)، به آرایه‌ای از نوع char با n+1 خانه نیاز است. حال اگر طول رشته (تعداد کاراکترهای تشکیل‌دهنده‌ی آن) کمتر از n باشد ۰\ بلافاصله بعد از آخرین کاراکتر رشته قرار می‌گیرد؛ بنابراین در آرایه‌ای از جنس char به طول مثل ۵۰ می‌توان رشته‌ای به طول صفرتا رشته‌ای به طول ۴۹ را ذخیره نمود.

در مورد رشته‌ی با طول صفر نشانه‌ی پایان رشته در خانه‌ی صفرم، در مورد رشته‌ی با طول ۴۹ نشانه‌ی بیان‌شده در خانه‌ی شماره ۴۹ یعنی آخرین خانه‌ی آرایه و در مورد رشته‌ای مثلاً با طول ۲۰ این نشانه در خانه‌ی شماره ۲۰ که در اواسط آرایه است قرار می گیرد.

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

می توان در مقداردهی اولیه طول رشته را مشخص نکرد. مانند مثال زیر:

  • بین [] خالی است. در این حالت آرایه بدون محدودیت تولید می‌شود که بسته به عناصر ورودی، تعداد اعضای خود را مشخص می‌کند. در این جا کد اسکی هر کدام از کاراکترها در خانه های آرایه ذخیره شده و صفر در خانه آخر قرار می گیرد. مانند تصویر بالا.
  • اگر دقت کرده باشید نحوه مقدار دهی به رشته ها به دو صورت است. می توان مانند مثال اول کد اسکی تک تک کاراکترها را به رشته داد یا می توان یک رشته را به صورت کامل درون آرایه ذخیره کرد.
  • آرایه‌ها و رشته‌ها، به همان شکل که مقداردهی اولیه می‌شوند، در خطوط اصلی برنامه نیز مقداردهی می‌شوند.
  • در متن یک ثابت رشته‌ای ( یعنی یک رشته که تغییر نمی کند مانند Hello) علاوه بر کاراکترهای قابل‌ چاپ می‌توان کاراکترهای کنترلی مانند n\ و t\ قرارداد و در صورت نیاز به خود کاراکتر ” باید آن را به‌صورت ”\ نوشت.

 

به مثال زیر دقت کنید:

  • در این خط تنها نکته جدید وجود کاراکتر کنترلی n\ است. وجود این کاراکتر باعث می شود که اگر بخواهیم این رشته را چاپ کنیم، بعد از چاپ مکان نما به خط بعد منتقل شده عملیات نمایش از خط جدید ادامه پیدا می کند.

 

آرایه‌ای از رشته‌ها

اگر بخواهیم رشته‌ای تعریف کنیم که نام ۱۰ دانشجو را نگهداری کند، چه‌کاری باید انجام دهیم؟

در این‌گونه موارد باید آرایه‌ای از رشته‌ها تعریف کنیم؛ مثلاً اگر بخواهیم رشته‌ای را برای نگهداری نام ۱۰ دانشجو که طول نام هرکدامشان ۱۵ کاراکتر است تعریف کنیم، به‌صورت زیر تعریف می‌کنیم:

 برای مقدار دهی هم به ترتیب زیر عمل میکنیم:

ارتباط اشاره‌گر با آرایه و رشته

در زبان برنامه‌نویسی C، بین آرایه‌ها با رشته‌ها و اشاره‌گرها، ارتباط نزدیکی وجود دارد. اشاره‌گرها حاوی آدرس هستند و اسم هر آرایه یا رشته نیز یک آدرس است. اسم آرایه، آدرس اولین عنصر آرایه را مشخص می‌کند؛ به‌عبارت‌دیگر، اسم هر آرایه، آدرس اولین محلی را که عناصر آرایه ازآنجا به بعد در حافظه ذخیره می‌شوند، نگهداری می‌کند؛ بنابراین اسم هر آرایه، یک اشاره‌گر است.

به مثال زیر توجه کنید:

یک آرایه با ۵ عنصر به نام table و اشاره‌گر p هر دو از نوع int معرفی‌شده‌اند. اگر اولین عنصر آرایه table در محل ۱۰۰۰ حافظه واقع‌شده باشد، نام آرایه به محل ۱۰۰۰ اشاره خواهد کرد.

 

جلسه امروز هم تموم شد. فعلا با رشته‌ها و قواعد ابتدایی اون ها آشنا شدیم و میتونیم اون ها رو تعریف کنیم و میدونیم چطوری ذخیره میشند اما خب کاربرد رشته ها به همین جا ختم نمیشه، بازم با ما همراه باشید تا در مباحث پیشرفته تر با رشته ها کارهای خیلی بیشتری انجام بدیم. راستی جلسه بعدی در مورد آرایه‌ها و اشاره گرها و قدرت اشاره گرها کمی می خوایم بحث کنیم.

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۵ دیدگاه

  1. سلام اگر بخوایم یک کاراکتر را در حافضه flash ذخیره کنیم چه کار باید کرد

  2. عالیییییییی!

  3. سلام مهندس
    میگم توی این عبارت
    char name[10][15]={“student1”, “student2″,…….,”student10”}
    مگه ما نباید تعداد ۱۰سطر داشته باشیم و۱۵ ستون؟
    یه چیزی شبیه این
    int array[2][4] = {{1,2,3,4},{5,6,7,8}};

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *