رشته ها (Strings) در برنامه نویسی C++ :
ما در فصول قبل با آرایه ها آشنا شدیم. در برنامه نویسی C++ نوع خاصی برای رشته ها یا همان String وجود ندارد و در این مورد باید از آرایه ای از کاراکترها استفاده کنیم. البته در Visual C++ میشه از فضای نامی std در مورد رشته ها استفاده کرد که کار را راحتتر می کند اما چون ما در Borland برنامه نویسی می کنیم نمی توانیم مستقیما با یک متغیر از نوع string کار کنیم .
قبلا یادگرفتیم که اعداد و کاراکترها را چگونه در آرایه قرار دهیم. برای استفاده از رشته ها باید از آرایه دو بعدی با نوع کاراکتر استفاده کنیم. به این نکته توجه نمایید که در زبان برنامه نویسی C++، رشته ها را بین " " و کاراکترها را بین ' ' قرار خواهیم داد. در زیر به نحوه تعریف یک رشته می پردازیم :
char str[] = "programming";
char s[10] = "computer";
char str1[] = {'C','+','+','\0'};
همانطور که در بالا می بینیم، نحوه تعریف یک رشته مانند تعریف یک آرایه است و از قوانین آرایه ها تبعیت می کند با این تفاوت که اگر مقدار بصورت رشته باشد باید آنرا در بین " " قرار دهیم و اگر مقادیر بصورت کاراکتر باشند آنها را در بین ' ' و بصورت مجموعه مقداردهی خواهیم کرد .
نکته) در مقداردهی یک String باید بدانیم که انتهای آن آرایه با تهی یا Null مشخص می شود. یعنی در خط اول از کد یالا یک آرایه بوجود خواهد آمد که اولین خانه آن حرف p و دومین خانه آن حرف r و علی آخر که در نهایت یکی مانده به آخرین خانه حرف g و آخرین خانه Null یا \0 می باشد .
در خط دوم ما Stringی را با طول 10 تعریف و مقداردهی کرده ایم، اما عبارت computer از 7 حرف تشکیل شده و آخرین خانه هم شامل \0 برای تعیین انتهای String خواهد بود که 2 خانه بلا استفاده باقی خواهد ماند .
در خط سوم چونکه ما رشته را بصورت کاراکتری در نظر گرفته ایم باید بصورت دستی مقدار \0 در انتهای مقداردهی String وارد نماییم تا به اینصورت کامپایلر متوجه پایان آن شود .
نکته) در تعریف و مقدار دهی یک String باید طول آرایه را همیشه یک واحد بیشتر از طول مورد نیاز انتخاب نماییم و دلیل آن مشخص نمودن انتهای آرایه با استفاده از کاراکتر تهی (\0) است .
برای خواندن و نوشتن Stringها می توانیم از دستورات ورودی خروجی cin ,cout استفاده کنیم، اما ممکن است در این مورد دچار مشکل شویم و آن مشکل این است که اگر ما نامی را بعنوان یک متغیر رشته ای مثل alireza aria را در نظر بگیریم در میان رشته خود ناگزیر از کاراکتر تهی یا همان \0 استفاده می کنیم که در اینصورت تابع cin آنرا بعنوان انتهای رشته در نظر گرفته و aria را دریافت نمی کند و لذا در ورود این متغیر String با استفاده از دستور cin به مشکل بزرگی بر می خوریم. پس دستور cin کاراکترهای فاصله (Space) و Enter را بعنوان انتهای یک آرایه از کاراکترها در نظر می گیرد .
برای رفع مشکل دریافت متغیری از نوع String، از تابع cin.get() استفاده می کتیم. تابع cin.get() آرایه ای از کاراکترها را می گیرد با این تفاوت که انتهای آرایه یا همان متغیر String را با فشار دادن دکمه Enter مشخص می نماید، پس با استفاده از این تابع مشکل ورود یک نام کامل برطرف می شود .
1 2 3 4 5 6 7 8 9 10 11 12
| |
#include
#include
void main()
{
char strArray[5][11];
for(int i=0 ; i<5 ; i++)
{
cin.get(strArray[i],10);
}
getch();
}
|
همانطور که در کد C++ با مشاهده می کنید تابع cin.get() دارای دو پارامتر ورودی است. اولین آرگومان شامل نام آرایه یا همان متغیر String است بهمراه اندیس عنصر مورد نظر و دومین آرگومان مربوط به بیشترین طول متغیر است. دقت کنید که این مقدار تخمینی از بیشترین طول ممکن برای یک نام کامل است و ضرورتی ندارد که نامها حتما هم مقدار با عدد مشخص شده باشد .
در کاملترین حالت از بکارگیری تابع cin.get() می توان آرگومان سومی نیز برای آن در نظر گرفت که مشخص کننده کاراکتر پایانی آرایه است، یعنی با نوشتن آرگومان سوم، کاربر برای کامپایلر تعیین می کند که با رسیدن به کدام کاراکتر انتهای آرایه یا همان String را مشخص نماید. بعنوان مثال در کد زیر از نقطه بعنوان کاراکتر پایانی بهره گرفته ایم، مشخص کرده ایم که فقط 15 کاراکتر اول را در نظر بگیرد. یعنی اگر نام از 15 کاراکتر بیشتر شد از کاراکتر 15 به بعد را در نظر نگیرد و اگر کمتر از 15 شد با فشار دادن دکمه نقطه از کیبرد پایان آنرا مشخص نماید .
char s[21];
cin.get(s,15,'.');
اعمال بر روی رشته ها (Strings) :
- انتساب رشته ها یا کپی کردن رشته ها در یکدیگر :
اگر دارای دو متغیر از نوع صحیح به نامهای aوb باشیم برای انتساب آنها از عملگر تساوی برای این منظور استفاده می کردیم(a=b;). اما در مبحث string نمی توانیم برای برابری دو رشته از این عملگر استفاده کنیم. برای انتساب یا کپی یا برابر قرار دادن یک رشته با رشته ای دیگر باید از تابع strcopy(string1,string2) که در فایل سرآیند <string.h> قرار دارد استفاده کنیم.
1 2 3 4 5 6
| |
#include
#include
#include
char str1[21], str2[21];
strcopy(str1,str2);
|
با اجرای تابع strcopy هرآنچه که در آرگومان دوم وجود دارد در آرگومان اول کپی خواهد شد، یعنی مقدار str2 در str1 قرار خواهد گرفت .
نکته) در استفاده از این تابع باید توجه کنید که اگر طول آرگومان دومی از اولی بیشتر باشد به اندازه ظرفیت رشته اول کپی شده و مابقی در خانه های حافظه بلافاصله بعد از رشته اول کپی خواهد شد، بنابر این اگر مقادیر مهمی بعد از رشته اول در حافظه وجود داشته باشند از بین میروند .
- مقایسه رشته ها (string) :
برای مقایسه دو متغیر از نوع صحیح یا اعشاری یا کاراکتری از دستور (if(x==y)) استفاده کردیم. در مورد string ما از تابع strcmp() بهره می گیریم. تابع strcmp() نیز در فایل سرآیند <string.h> قرار دارد .
1 2 3 4 5 6 7
| |
#include
#include
#include
char str1[11] = "Ali";
char str2[11] = "Alireza";
strcmp(str1,str2);
|
در صورت برابری دو مقدار، تابع عدد صفر و اگر str1<str2 باشد تابع مقدار منفی برمی گرداند یعنی str1 از str2 کوچکتر است و در حالی که str1>str2 تابع مقدار مثبتی را برمی گرداند یعنی اینکه str1 از str2 بزرگتر است .
در کد بالا بنابر توضیحات داده شده، تابع strcmp مقداری منفی را بر میگرداند .
- الحاق یا اتصال رشته ها (string) :
برای الحاق دو string از تابع strcat() استفاده خواهیم نمود که این تابع هم در فایل سرآیند <string.h> وجود دارد .
1 2 3 4 5 6 7
| |
#include
#include
#include
char str1[15] = "Alireza";
char str2[11] = "Aria";
strcat(str1,str2);
|
تابع strcat مقدار string دوم را در ادامه string اول قرار می دهد و باید توجه نمود اگر طول str1 از نتیجه نهایی کمتر باشد کاراکترهای باقی مانده در ادامه str1 در حافظه قرار خواهند گرفت و اگر در آنجا متغیرهایی باشند از بین خواهند رفت .