برای روشن کردن ترمینال، کلیک کن یا هر کلیدی را بزن

پرش به محتوای اصلی
>_
درس ۲۲متوسط

توابع کتابخانه‌ای رشته C (string.h)

آشنایی با strlen، strcpy، strcat و strcmp به همراه اصلاح اشتباهات رایج جزوه

معمولی
آرایه‌ها و رشته‌ها•صفحه ۳۴•۳۰ دقیقه•۱٬۱۰۰ کلمهزمان مطالعه: ۰ دقیقه
فهرست این درس
// اهداف۵
  • شناخت هدر <string.h> و توابع کتابخانه‌ای مدیریت رشته در سبک C
  • استفاده صحیح از strlen، strcpy، strcat، strcmp
  • درک ترتیب آرگومان‌ها در strcpy (مقصد، منبع)
  • پیاده‌سازی برنامه‌ای برای حذف کاراکتر سمی‌کالن از رشته
  • مقایسه کار با char[] در برابر std::string

مقدمه‌ای بر کتابخانه string.h

در زبان C، رشته‌ها به‌صورت آرایه‌ای از کاراکتر‌ها که با کاراکتر پوچ \0 (Null Terminator) خاتمه می‌یابند، ذخیره می‌شوند. برای مثال رشته "SALAM" در حافظه به این شکل است:

main.cppcpp

کتابخانه <string.h> مجموعه‌ای از توابع آماده برای کار با این رشته‌ها فراهم می‌کند. مهم‌ترین آن‌ها عبارت‌اند از:

  • strlen(s) → طول رشته
  • strcpy(dest, src) → کپی رشته
  • strcat(dest, src) → الحاق رشته
  • strcmp(s1, s2) → مقایسه دو رشته

در ⁦C++⁩ مدرن پیشنهاد می‌شود از کلاس std::string (هدر <string>) استفاده کنید، اما آشنایی با <string.h> برای درک کدهای قدیمی و سوالات کنکور ضروری است.

تابع strlen — محاسبه طول رشته

تابع strlen(s) تعداد کاراکتر‌های رشته قبل از کاراکتر \0 را برمی‌گرداند.

main.cppcpp

توجه: strlen فقط تا رسیدن به اولین \0 را می‌شمارد. اگر آرایه شما ۱۰۰ خانه داشته باشد اما رشته در خانه پنجم به \0 ختم شود، strlen عدد ۵ را برمی‌گرداند (نه ۱۰۰).

مثال strlen

استفاده از strlen برای شمارش کاراکتر‌هاcpp

نمونه اجرا

خروجی
رشته را وارد کن: Salam
طول رشته: 5

تابع strcpy — کپی رشته

امضای تابع: char* strcpy(char* destination, const char* source);

این تابع محتوای رشته source (منبع) را در destination (مقصد) کپی می‌کند، شامل کاراکتر \0.

main.cppcpp

نکته مهم: آرگومان اول مقصد و آرگومان دوم منبع است. این ترتیب در بسیاری از کتب و جزوات اشتباه نوشته شده است.

اصلاح توضیح strcpy در جزوه

در جزوه اصلی نوشته شده: «strcpy(ch2,ch1); → کپی کردن ch2 به ch1» که از نظر فنی غلط است. تابع strcpy محتوای آرگومان دوم (منبع) را در آرگومان اول (مقصد) کپی می‌کند، نه برعکس.

نسخه اشتباه جزوه
کد دارای باگcpp
نسخه اصلاح‌شده و استاندارد
کد صحیحcpp

مثال strcpy و strcat

کپی و الحاق دو رشتهcpp

خروجی برنامه

خروجی
Copy: Hello, 
After strcat: Hello, World!

تابع strcmp — مقایسه دو رشته

تابع strcmp(s1, s2) دو رشته را به‌صورت لغوی (Lexicographic) مقایسه می‌کند و مقدار زیر را برمی‌گرداند:

مقدار بازگشتیمعنی
0s1 برابر s2
< 0s1 کوچک‌تر از s2
> 0s1 بزرگ‌تر از s2

نکته: برای بررسی برابری دو رشته در سبک C باید بنویسید if (strcmp(s1, s2) == 0). استفاده از if (s1 == s2) در C فقط آدرس دو آرایه را مقایسه می‌کند که معمولاً مدنظر نیست.

مثال strcmp

مقایسه دو رشته با strcmpcpp

فلوچارت مقایسه دو رشته

flow.svg

برنامه حذف سمی‌کالن از رشته

برنامه‌ای بنویسید که رشته‌ای را از ورودی بگیرد و تمام کاراکتر‌های ; را حذف کرده، به‌جای هرکدام یک خط جدید (endl) چاپ کند.

مثال: ورودی hello;world → خروجی:

main.cppcpp
main.cppcpp

خروجی برنامه حذف سمی‌کالن

خروجی
رشته را وارد کن: hello;world
hello
world

سبک C در برابر ⁦C++⁩: مقایسه دو رشته

برنامه مقایسه دو رشته به‌صورت کاراکتر به کاراکتر در نسخه جزوه تا طول s1 پیمایش می‌کرد که اگر s2 کوتاه‌تر باشد، خطر دسترسی خارج از محدوده وجود دارد. نسخه اصلاح‌شده از کلاس std::string و عملگر == استفاده می‌کند که هم ساده‌تر و هم امن‌تر است.

نسخه اشتباه جزوه
کد دارای باگcpp
نسخه اصلاح‌شده و استاندارد
کد صحیحcpp

خطر سرریز بافر (Buffer Overflow)

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

main.cppcpp

راه‌حل‌ها:

  • از نسخه‌های امن strncpy و strncat با محدودسازی طول استفاده کنید.
  • یا بهتر، از std::string استفاده کنید که خودش حافظه را مدیریت می‌کند.

هدر <cstring> به‌جای <string.h>

در ⁦C++⁩ مدرن به‌جای #include <string.h> از #include <cstring> استفاده کنید. تفاوت:

  • <string.h> — سبک C خالص، توابع در فضای نام سراسری.
  • <cstring> — سبک ⁦C++⁩، توابع در فضای نام std (و گاهی سراسری).

بهترین کار: هم using namespace std; بنویسید و هم از <cstring> استفاده کنید.

مرور سریع مطالب

۱۶ بخش در این درس

تمرین‌ها

01
تمرین•حل کامل دارد

برنامه‌ای بنویسید که دو رشته را از ورودی بگیرد و با `strcmp` بررسی کند که آیا برابرند یا خیر. در صورت برابری پیام «برابر» و در غیر این صورت پیام «نابرابر» چاپ شود.

نمایش راهنما
از `if (strcmp(s1, s2) == 0)` استفاده کنید.
02
تمرین•حل کامل دارد

برنامه‌ای بنویسید که نام و نام‌خانوادگی کاربر را در دو آرایه کاراکتری بگیرد، آن‌ها را به‌هم بچسباند (با یک فاصله بینشان) و رشته نهایی را به‌همراه طول آن چاپ کند.

نمایش راهنما
از `strcat` برای الحاق و `strlen` برای طول استفاده کنید. برای فاصله می‌توانید ابتدا `strcat(full, " ")` را فراخوانی کنید.
03
تمرین•حل کامل دارد

برنامه‌ای بنویسید که رشته‌ای را بگیرد و تعداد تکرار یک کاراکتر مشخص (مثلاً `'a'`) را در آن بشمارد.

نمایش راهنما
با حلقه `for` روی کاراکتر‌ها پیمایش کنید و با شمارنده افزایشی کار کنید.
04
تمرین•حل کامل دارد

همان برنامه حذف سمی‌کالن را با استفاده از `std::string` و `getline` بازنویسی کنید تا ورودی می‌تواند شامل فاصله هم باشد.

نمایش راهنما
از `getline(cin, s)` برای خواندن خط کامل استفاده کنید و با حلقه for پیمایش کنید.
// نکات-کلیدی۶
  • 01رشته‌های سبک C آرایه‌هایی از کاراکتر با پایان‌دهنده `\0` هستند و توابع مدیریت آن در `<string.h>` یا `<cstring>` قرار دارند.
  • 02تابع `strlen` طول واقعی رشته (تا `\0`) را برمی‌گرداند، نه اندازه آرایه را.
  • 03در `strcpy(dest, src)` آرگومان اول مقصد و دوم منبع است؛ توضیح معکوس در برخی جزوات اشتباه است.
  • 04برای مقایسه برابری در سبک C از `strcmp(s1, s2) == 0` استفاده کنید؛ در ⁦C++⁩ مدرن با `std::string` از `s1 == s2`.
  • 05در استفاده از `strcpy` و `strcat` همیشه ظرفیت آرایه مقصد را چک کنید تا سرریز بافر رخ ندهد.
  • 06در پروژه‌های جدید ⁦C++⁩ ترجیح بر استفاده از `std::string` است چون حافظه را خودکار مدیریت می‌کند.
./project-arraysپروژهٔ پایانی این دسته

آمارگیر کلاس

کار کامل با آرایه، مرتب‌سازی، جستجو و هیستوگرام

آخرین درس این دسته را تمام کردی — وقت آن است که همه‌چیز را یک‌جا به محک بزنی. برنامه‌ای بنویس که نمرهٔ n دانش‌آموز (حداکثر ۱۰۰ نفر) را در آرایه بخواند و گزارش کامل بدهد: بیشینه، کمینه، میانگین، نمرات مرتب‌شده، رتبهٔ یک نمرهٔ مشخص (جستجو) و هیستوگرام توزیع نمرات به‌ازای هر بازهٔ دو نمره‌ای (۰-۱، ۲-۳، …).

⏱ ۹۰ دقیقه تا ۲ ساعت۶ نیازمندی — هر کدام به یک درس لینک است
شرح کامل پروژه
گام بعدی پیشنهادی

مقدمه گرافیک در ⁦C++⁩

آشنایی با کتابخانه graphics.h، سیستم مختصات، رنگ‌ها و رسم دایره از روی قطر

۴۰ دقیقهپیشرفته۱۴ بخش

شروع درس

جستجوی سریع در درس‌ها

نام درس، موضوع یا کلمه کلیدی را بنویسید و با Enter به آن بروید