زبان C – رشتهها (جلسه ۵)
زمان تقریبی مطالعه این مقاله: ۵ دقیقه
سلام به دوستان خوب میکرولرنی 🙂 🙂 🙂
این مقاله در ۲۱ اردیبهشت ۱۴۰۰ به روزرسانی شده.
بالاخره رسیدیم به مقاله رشته در زبان C. تا این جلسه از زبان C مباحثی مثل متغیر، اشارهگر و آرایهها مورد بررسی قرار گرفتند. اگر در این مباحث احساس ضعف میکنید، میتونید از لینکهای زیر، مقالهها را مطالعه کنید.
در این جلسه در مورد رشتهها صحبت میکنیم. با استفاده از رشتهها میتونید حروف الفبا و سبملها و هم چنین جملات و پاراگرافها را ذخیره یا استفاده کنید. مثلا فرض کنید میخواهید با یک فرم در صفحهی یک نرم افزار، اطلاعات افراد مختلف را دریافت کرده و در پایگاه داده ذخیره کنید. برای ذخیره چنین اطلاعاتی از رشتهها استفاده میکنیم. حالا که با کاربرد رشتهها به صورت اولیه آشنا شدید؛ میتونیم بریم سراغ رشتهها در زبان C تا اصول و قواعدشون را بررسی کنیم.
فهرست مطالب
رشته در زبان C
قبل از گفتن جزئیات و syntax رشتهها در زبان C بهتر است با مفاهیم اولیهای مثل کاراکتر و رشته به شکل پایهای آشنا شویم و سپس نحوه تعریف و … را بیان کنیم.
مفهوم کاراکتر
همه ما در طول روز با گوشیهای هوشمند خودمان، پیامهای زیادی ارسال میکنیم. وقتی دکمهای را روی صفحه گوشی فشار میدهیم؛ کد اختصاصی دکمه که متناظر با کاراکتر نوشته شدهی روی آن است به نمایشگر ارسال شده و نمایشگر آن را نشان میدهد. (مثلا با فشردن دکمهی a، کد ۹۷ برای نمایشگر ارسال میشود.)
ممکن است بپرسید که ۹۷ از کجا آمد؟ پاسخ را باید در جدول کدهای ASCII جستجو کرد. در واقع تمامی حروف کوچک و بزرگ الفبا، اعداد، سبملها و … یک کاراکتر بوده و برای مشاهده روی صفحههای نمایش نیاز به یک کد استاندارد به نام کد ASCII دارند. در جدول کدهای ASCII برای هر حرف یا سمبل یک کد اختصاصی در نظر گرفته شده است.
مفهوم رشته
کاراکترها کنار هم قرار میگیرند و کلمات، جملات، پاراگرفها و متنها را میسازند. در واقع دنبالهای از کاراکترها به وجود میآید که رشته نام دارد. مثلا رشتهی “salam” را در نظر بگیرید که از پنج کاراکتر ‘s’ و ‘a’ و ‘l’ و ‘a’ و ‘m’ تشکیل شده است.
در زبان C میتوان رشتهها را ذخیره سازی، بازیابی و دستکاری کرد. برای این منظور باید از آرایهها استفاده کرد. شاید تعجب کنید که چرا از آرایه برای ذخیره سازی رشتهها استفاده میشود. علت آن است که، در زبان C برای ذخیره رشتهها یک نوع جدید داده تعریف نشده است. رشته همان آرایه است که خانههای آن با کدهای اسکی پر شده و آخرین خانه هم مقدار صفر دارد.
تعریف رشته در زبان C
همان طور که گفته شد، رشته آرایهای از کاراکترهاست. پس برای تعریف رشته باید مانند تعریف آرایه عمل کرد با این تفاوت که نوع رشته فقط میتواند char انتخاب شود.
در زبان c رشتهها باید بین یک زوج علامت double quotes یعنی ” ” قرار گیرد ولی کاراکترها بین یک زوج علامت single quotes یعنی ‘ ‘ قرار میگیرند.
وقتی حرفی یا کاراکتری بین single quotes قرار میگیرد برای کامپایلر به معنی کد اسکی (ASCII) آن حرف یا کاراکتر است. همچنین وقتی کلمه یا جملهای بین double quotes قرار می گیرد، به ازای تک تک کاراکترهای آن، کد اسکی معادل آنها در نظر گرفته میشود. به یک نمونه تعریف و مقداردهی اولیهی رشته دقت کنید:
unsigned char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
یک آرایه از نوع کاراکتری (یا همان رشته) با نام str برای ذخیره کلمه”Hello” با طول ۶ مورد استفاده قرار گرفته است. به نظر شما چرا رشته با طول ۵ استفاده نشده است؟ (با مطالعه ادامه مقاله میتوانید به این سوال پاسخ دهید 🙂 )
قوانین رشته در زبان C
۱- کامپایلر زبان C برای تعیین انتهای رشته از کاراکتر خاصی به نام (تهی = null) استفاده میکند که با (‘۰\ ‘) (بایتی حاوی هشت بیت صفر و ارزش عددی صفر) مشخص میگردد. در واقع آخرین عضو رشته به کاراکتر تهی یا همان صفر ختم میشود.
۲- برای ذخیره کلمهای با طول n کاراکتر، به آرایهای از نوع char و n+1 خانه نیاز است. بنابراین در آرایهای از جنس char به طول مثلا ۵۰ میتوان رشتههایی با طول نهایتا ۴۹ را ذخیره نمود.
۳- در چنین آرایهای با طول ۵۰ اگر رشتههای کوتاهتر از این طول ذخیره شود؛ کاراکتر تهی یا ‘۰\’ بلافاصله بعد از آخرین کاراکتر رشته قرار میگیرد.
طول غیر مجاز
در صورت ذخیره رشتهای با طول بیش ازحد مجاز تعریف شده برای آرایه، به دلیل اینکه این موضوع توسط کامپایلر C کنترل نمیشود، عمل ذخیرهسازی انجامشده، کاراکترهای اضافی هم با نشانهی پایان رشته در بایتهایی از حافظه که خارج از محدودهی آرایه است ثبت میگردد. اما هیچ تضمینی برای دسترسی به کاراکترهایی که خارج از طول آرایه ذخیره شدهاند؛ وجود ندارد.
مقدار دهی اولیه
می توان در مقداردهی اولیه طول رشته را مشخص نکرد. مانند مثال زیر:
unsigned char str[] = "Hello";
- بین [ ] خالی است. در این حالت آرایه بدون محدودیت تولید میشود که بسته به عناصر ورودی، تعداد اعضای خود را مشخص میکند. در این جا کد اسکی هر کدام از کاراکترها در خانههای آرایه ذخیره شده و صفر در خانه آخر قرار می گیرد.
- اگر دقت کرده باشید نحوه مقدار دهی به رشته ها به دو صورت است. می توان مانند مثال اول کد اسکی تک تک کاراکترها را به رشته داد یا می توان یک رشته را به صورت کامل درون آرایه ذخیره کرد.
- رشتهها، فقط در زمان تعریف، به این شکل مقداردهی میشوند. اما در میان برنامه این کار غیر مجاز است.
- در متن یک ثابت رشتهای ( یعنی یک رشته که تغییر نمی کند مانند Hello) علاوه بر کاراکترهای قابل چاپ میتوان کاراکترهای کنترلی مانند n\ و t\ قرارداد و در صورت نیاز به خود کاراکتر ” باید آن را بهصورت ”\ نوشت.
به مثال زیر دقت کنید:
char str[]={"hello\n"};
در این خط تنها نکته جدید وجود کاراکتر کنترلی n\ است. وجود این کاراکتر باعث می شود که اگر بخواهیم این رشته را چاپ کنیم، بعد از چاپ، مکان نما به خط بعد منتقل شده عملیات نمایش از خط جدید ادامه پیدا می کند.
آرایهای از رشته ها
اگر بخواهیم رشتهای تعریف کنیم که نام n دانشجو را نگهداری کند، چهکاری باید انجام دهیم؟
در این گونه موارد باید آرایهای از رشتهها تعریف کنیم. در مثال زیر آرایهای برای نگهداری نام ۲ دانشجو که طول نام هر کدامشان نهایتا ۱۵ کاراکتر است تعریف کردهایم:
char name [2][15];
برای مقدار دهی هم به ترتیب زیر عمل میکنیم:
char name[2][15]={"student1", "student2"};
ارتباط اشارهگر با آرایه و رشته
در زبان برنامهنویسی C، بین آرایه، رشته و اشارهگر، ارتباط نزدیکی وجود دارد. اشارهگرها حاوی آدرس هستند و اسم هر آرایه یا رشته نیز یک آدرس است. اسم آرایه، آدرس اولین عنصر آرایه را مشخص میکند.
بهعبارتدیگر، اسم هر آرایه، آدرس اولین محلی را که عناصر آرایه از آنجا به بعد در حافظه ذخیره میشوند، نگهداری میکند. بنابراین اسم هر آرایه، یک ثابت اشارهگر است. چرا که این آدرس تغییر نمیکند.
به مثال زیر توجه کنید:
char table[5];
char *p;
- یک آرایه با ۵ خانه به نام table و اشارهگر p هر دو از نوع char معرفی شدهاند.
- اگر اولین عنصر آرایه table در محل ۱۰۰۰ حافظه واقع شده باشد، نام آرایه به محل ۱۰۰۰ اشاره خواهد کرد. بنابراین نام آرایه یک ثابت اشارهگر است.
- خط دوم یک متغیر اشارهگر را نشان میدهد.
- توجه کنید که با نام آرایه یا رشته میتوان به محتوای خانهها دسترسی پیدا کرد. در این مورد در مقاله آرایهها توضیحات کافی داده شده است.
سخن آخر
یه خسته نباشید میگم به میکرولرنیهای عزیز که تا آخر این مقال همراه ما بودند. 🙂 🙂 🙂
جلسه امروز هم تموم شد. با رشتهها و قواعدشون آشنا شدیم. حالا میتونیم رشتهها رو تعریف و مقدار دهی کنیم و در طول برنامه باهاشون کار کنیم. در جلسه بعدی میریم سراغ ساختارهای زبان C، پس با ما همراه باشید.
اما مثل همیشه برای کسانی که قصد دارند خیلی فراتر از این مقاله با زبان C درگیر بشند و درکارهای واقعی مثل میکروکنترلرها و کارهای نرم افزاری از اون استفاده کنند پیشنهاد میکنم از دوره جامع برنامه نویسی C استفاده کنید. برای دسترسی به دوره روی عکس زیر کلیک کنید.
درباره احسان عبداللهی
مدیر و موسس میکرولرن | برنامه نویسی پاسخی ظریف به یک نیاز در دنیای واقعی هست.
نوشته های بیشتر از احسان عبداللهیمطالب زیر را حتما مطالعه کنید
دوره های آموزشی مرتبط
آموزش جنگو
آموزش پایتون
آموزش الگوریتم و فلوچارت – تفکر برنامه نویسی
آموزش برنامه نویسی C برای میکروکنترلر
آموزش الکترونیک دیجیتال
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
بسیار عالییییییی ، خیلی به دلم چسبید
بسیار سپاسگزارم استاد جان
برای من جای خوشحالی داره که این مطلب براتون مفید بوده. موفق باشید
سلام اگر بخوایم یک کاراکتر را در حافضه flash ذخیره کنیم چه کار باید کرد
سلام . در کدویژن قبل از تعریف متغیر از کلمه flash استفاده کنید.
عالیییییییی!
سلام مهندس
میگم توی این عبارت
char name[10][15]={“student1”, “student2″,…….,”student10”}
مگه ما نباید تعداد ۱۰سطر داشته باشیم و۱۵ ستون؟
یه چیزی شبیه این
int array[2][4] = {{1,2,3,4},{5,6,7,8}};
سلام
چرا با دقت مطالب را نمیخونید؟ خیلی واضح توضیح دادم. اینجا بحث رشته های دو بعدی هست نه آرایه های دو بعدی.