به دهمین جلسه از آموزش برنامه نویسی ++C خوش آمدید. در این جلسه با مبحث رشته های کاراکتری در ++C آشنا خواهیم شد.
رشته های کاراکتری در ++C
طبق تعریف یک رشته کاراکتری، آرایه ای از کاراکترهای کنار هم در حافظه است که با کاراکتر NUL خاتمه می یابد. کاراکتر NUL به معنی کاراکتر تهی (پوچ) است. آخرین خانه هر آرایه (رشته) کاراکتری با این کاراکتر پر می شود و وظیفه آن مشخص کردن انتهای رشته است.
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 |
int main() { char s[] = "ABCD"; cout << s << endl; for(int i = 0 ; i < 5 ; i++) cout << "s[" << i << "] = '" << s[i] << "'" << endl; } |
در قطعه کد بالا در خط ۳ یک رشته کاراکتری به نام s تعریف و با مقدار “ABCD” مقداردهی شده است. در خط ۵ کل رشته را چاپ کرده ایم و در ادامه با یک حلقه for ، تک تک خانه های آرایه (رشته) موردنظر را در خروجی چاپ کرده ایم.
خروجی به صورت زیر است:
1 2 3 4 5 6 |
ABCD s[0] = 'A' s[1] = 'B' s[2] = 'C' s[3] = 'D' s[4] = '' |
اینکه در خط آخر خروجی مابین دو علامت تک کوتیشن هیچ کاراکتری چاپ نشده است، گویای این مطلب است که در این خانه کاراکتر NUL قرار گرفته است. این کاراکتر دیدنی نیست (کاراکتر پوچ | تهی).
تعدادی از توابع کتابخانه ای کار با رشته های کاراکتری در ++C
از آنجا که رشته های کاراکتری بسیار پرکاربرد هستند، تعداد زیادی از توابع کتابخانه ای برای کار با رشته های کاراکتری در ++C در نظر گرفته شده است. در جلسه هفتم از آموزش های برنامه نویسی به زبان ++C در مورد توابع کتابخانه ای بحث کردیم. در این بخش تعدادی از توابع کتابخانه ای مهم و پرکاربرد برای کار با رشته های کاراکتری در ++C را شرح می دهیم.
تابع ()strlen
تابع ()strlen تعداد کاراکترهای موجود در یک رشته کاراکتری را محاسبه می کند (بدون در نظر گرفتن NUL). به عبارت دیگر کار این تابع محاسبه طول یک رشته کاراکتری است.
1 2 3 4 5 6 7 8 |
int main() { char s[] = "ABCD"; cout << s << endl; cout << strlen(s); } |
خروجی این قطعه کد به صورت زیر است:
1 2 |
ABCD 4 |
تابع ()strchr
تابع ()strchr اولین محل وقوع یک کاراکتر خاص را در یک رشته پیدا می کند. نکته ای که در کار با تابع ()strchr می بایست به آن توجه داشت این است که این تابع اندیس (شماره) خانه مورد نظر را برنمی گرداند. خروجی این تابع یک اشاره گر است. یعنی آدرس خانه ای را بر می گرداند که کاراکتر موردنظر در آن خانه قرار گرفته است.
1 2 3 4 5 6 7 8 9 10 |
int main() { char s[] = "hello john"; cout << s << endl; char* p = strchr(s, 'o'); cout << p - s; } |
در خط ۷ تابع ()strchr با دو پارامتر فراخوانی شده است. پارامتر اول رشته ای است که می خواهیم عمل جستجو را در آن انجام دهیم. پارامتر دوم نیز کاراکتر مدنظر ماست که می خواهیم محل وقوع آن را پیدا کنیم (اولین محل وقوع). از آنجا که مقدار برگشتی تابع ()strchr یک آدرس است، ما نیز آن را درون اشاره گر p ذخیره کرده ایم.
نکته دیگری که در خط ۹ وجود دارد و باید به آن توجه داشته باشیم، نحوه بدست آوردن اندیس (شماره) خانه محل وقوع کاراکتر ‘o’ است. اسم هر آرایه در واقع یک اشاره گر به ابتدای آن آرایه است. یعنی به اولین خانه آرایه اشاره می کند. پس ما با محاسبه اختلاف آدرس محل وقوع کاراکتر موردنظر از ابتدای آرایه، می توانیم اندیس خانه موردنظر را محاسبه کنیم.
خروجی این قطعه کد به این صورت است:
1 2 |
hello john 4 |
تابع ()strrchr
تابع ()strrchr آخرین محل وقوع یک کاراکتر خاص را در یک رشته پیدا می کند.
1 2 3 4 5 6 7 8 9 10 |
int main() { char s[] = "hello john"; cout << s << endl; char* p = strrchr(s, 'o'); cout << p - s; } |
خروجی این قطعه کد به این صورت است:
1 2 |
hello john 7 |
تابع ()strstr
تابع ()strstr عمل جستجوی یک رشته در رشته دیگر را انجام می دهد. در قطعه کد زیر می خواهیم بدانیم که آیا زیررشته “john” در رشته موردنظر ما وجود دارد یا خیر؟
1 2 3 4 5 6 7 8 9 10 |
int main() { char s[] = "hello john"; cout << s << endl; char* p = strstr(s, "john"); cout << p - s; } |
خروجی این قطعه کد به این صورت است:
1 2 |
hello john 6 |
تابع ()strcmp
تابع ()strcmp دو رشته کاراکتری را با هم مقایسه می کند. اگر رشته اول از رشته دوم کوچکتر باشد (به لحاظ ترتیب الفبایی)، یک مقدار منفی برگشت داده می شود. چنانچه دو رشته با هم برابر باشند، مقدار برگشتی صفر است. و در نهایت چنانچه رشته اول از رشته دوم بزرگتر باشد یک عدد مثبت برگردانده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int main() { char s1[] = "xyz"; char s2[] = "abcdef"; cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; int result = strcmp(s1, s2); if(result < 0) cout << "s1 < s2"; if(result == 0) cout << "s1 = s2"; if(result > 0) cout << "s1 > s2"; } |
خروجی این قطعه کد به این صورت است:
1 2 3 |
s1: xyz s2: abcdef s1 > s2 |
تابع ()strcpy
تابع ()strcpy جهت کپی کردن یک رشته بر روی رشته دیگر استفاده می شود. این تابع پارامتر دوم را روی پارامتر اول کپی می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main() { char s1[] = "abcdef"; char s2[] = "xyz"; cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; strcpy(s1, s2); cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; } |
خروجی این قطعه کد به این صورت است:
1 2 3 4 |
s1: abcdef s2: xyz s1: xyz s2: xyz |
تابع ()strncpy
تابع ()strncpy جهت کپی کردن n کاراکتر اول یک رشته بر روی رشته دیگر استفاده می شود. این تابع n کاراکتر اول پارامتر دوم را روی n کاراکتر اول پارامتر اول کپی می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main() { char s1[] = "abcdef"; char s2[] = "xyz"; cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; strncpy(s1, s2, 2); cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; } |
خروجی این قطعه کد به این صورت است:
1 2 3 4 |
s1: abcdef s2: xyz s1: xycdef s2: xyz |
تابع ()strcat
تابع ()strcat جهت اضافه کردن (چسباندن) یک رشته به انتهای یک رشته دیگر استفاده می شود. این تابع پارامتر دوم را به انتهای پارامتر اول اضافه می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main() { char s1[] = "abcdef"; char s2[] = "xyz"; cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; strcat(s1, s2); cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; } |
خروجی این قطعه کد به این صورت است:
1 2 3 4 |
s1: abcdef s2: xyz s1: abcdefxyz s2: xyz |
تابع ()strncat
تابع ()strncat جهت اضافه کردن (چسباندن) n کاراکتر اول یک رشته به انتهای یک رشته دیگر استفاده می شود. این تابع n کاراکتر اول پارامتر دوم را به انتهای پارامتر اول اضافه می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main() { char s1[] = "abcdef"; char s2[] = "xyz"; cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; strncat(s1, s2, 2); cout << "s1: " << s1 << endl; cout << "s2: " << s2 << endl; } |
خروجی این قطعه کد به این صورت است:
1 2 3 4 |
s1: abcdef s2: xyz s1: abcdefxy s2: xyz |
به پایان این جلسه آموزشی رسیدیم. در آینده با بخشهای دیگری از زبان ++C آشنا خواهیم شد. با ما همراه باشید…
22 دیدگاه. ارسال دیدگاه جدید
خیلی مختصر و مفید، خسته نباشید
عالی بود استاد
نهایت تشکر و ازتون دارم
خیلیییی خوب و کامل توضیح میدین. ممنون که این منابع رو رایگان گذاشتید 🙂
سلام خیلییی ممنونم از آموزش های فوق العادتون امیدوارم همیشه سالم و خوشحال باشید
ممنون از شما، من هم برای شما آرزوی موفقیت و سربلندی می کنم.
سلام خسته نباشید استاد. آموزش هاتون خیلی خوب و مفید هستن
یه سوال داشتم
چجوری میتونیم یک رشته رو که کاربر وارد میکنه با استفاده از تابع بازگشتی معکوس کنیم ؟
دوست عزیز برنامه زیر به کمک دو تابع ()recursive_reverse و ()swap بصورت بازگشتی یک رشته ورودی رو معکوس میکنه:
سلام
من میخوام یک استرینگ را دریافت کنم و بهش عدد خیلی بزرگی بدهم، چون متغیری آنقدر بزرگ نداریم. چجوری آنها را با هم جمع کنم؟
دوست عزیز برای انجام محاسبات بر روی اعداد بزرگ میتونید از نوع long long int استفاده کنید.
اگر اشتباه نکنم تا حدود ۲۰ رقم رو میتونه تو خودش ذخیره کنه.
سلام آقای زعفری مرسی از درسهای عالی که میدین…
یه سوال داشتم اینکه چرا تو ++dev c خواستم توابع آماده رشته ای رو استفاده کنم ارور میداد که نمیشناسه….
از چه include ای استفاده کنم برای شناسایی این توابع؟؟
دوست عزیز include زیر رو تست کنید:
خیلی ممنون، بله درست شد و برنامه اجرا شد. ممنون از تدریس بینظیرتون
خوشحالم که مشکلتون حل شد
سلام خسته نباشید ممنون از سایت خوبتون.
ببخشید من میخوام یه مقداری رو از ورودی بگیرم و آدرس مکان ذخیره کاراکترهام رو چاپ کنم.
چجوری باید این کار رو بکنم؟
دوست عزیز این برنامه ای هست که من در ++dev c ازش خروجی گرفتم.
برای تسلط به کدهای نوشته شده باید جلسات مرتبط با آرایه، اشاره گر و رشته های کاراکتری رو ملاحظه کنید.
کلیت کار این هست که ما با تابع ()getline یک رشته حداکثر ۲۰ کاراکتری رو از ورودی دریافت کردیم و بعد با استفاده از حلقه for و بحث اشاره گرها خود کاراکتر و آدرس اون رو در خروجی چاپ کردیم.
موفق باشید
کارتون حرف نداره، عالیه
هی می خواستم سی پلاس پلاس رو شروع کنم ولی آموزشها همشون بد بودن نمی فهمیدی.
شما خیلی خوب توضیح میدین
عالی هستید شما
سلام ممنونم از آموزش فوق العادتون
میخواستم بدونم میشه دو تا استرینگ رو محتویاتش رو با هم مقایسه کرد و ببینیم محتویات دو استرینگ با هم برابر هست یا نه؟
بله دوست عزیز
این کار با استفاده از تابع کتابخانه ای ()strcmp انجام میشه که در همین جلسه آموزشی نحوه کار با اون تشریح شده.
سلام آقای مهندس
ببخشید برای استفاده از این توابع نیازی به include خاصی نیست؟؟؟؟
خیر دوست عزیز، اینها توابع شناخته شده زبان ++C هستن و نیازی به include خاصی ندارن.
ببخشید استاد من تو یک کدی با دستور sprintf مواجه شدم. این دستور کارش چیه؟؟؟
دوست عزیز این دستور مریوط به زبان C هست نه ++C