cpp-05-05 - مگه ما رشته داریم؟ strings in cpp

بازدید : 10

1

اشتراک

cpp-05-05 - مگه ما رشته داریم؟ strings in cpp

توضیحات :

در C++ برای کار با رشته‌ها (String) دو روش اصلی وجود دارد. قبل از هر چیز بیاییم از پایه شروع کنیم که دقیقاً رشته چیست و چرا در C++ رفتار متفاوتی دارد.


🔹 1. تعریف یک رشته در C++ (روش مدرن با <string>)

برای اینکه بتوانیم از رشته‌ها استفاده کنیم، ابتدا باید هدر فایل زیر را include کنیم:

#include <string>

سپس داخل تابع main مثل هر نوع داده‌ی دیگر می‌توانیم یک متغیر رشته‌ای تعریف کنیم:

string s = "Tabz Media"; cout << s;

این کاملاً درست کار می‌کند و خروجی هم همان رشته خواهد بود.

اما یک نکته‌ی مهم اینجاست:


🔵 2. نکتهٔ کلیدی: C و C++ ذاتاً نوع دادهٔ رشته ندارند

این موضوع هم در C صادق است و هم در C++:

نوع دادهٔ string به‌صورت نیتیو و اصلی در زبان وجود ندارد.

یعنی چی؟

  • وقتی int a = 5 می‌نویسی:
    این دستور مستقیماً به کد CPU تبدیل می‌شود.
    چون int یک نوع دادهٔ ذاتی (native) زبان است.

  • اما وقتی می‌نویسی:

string s = "Tabz Media";

این مستقیماً به کد CPU تبدیل نمی‌شود.
چون string اصلاً جزو نوع‌های پایهٔ زبان نیست!

بلکه:

  1. ابتدا کد تبدیل می‌شود به یک‌سری عملیات C++

  2. آن عملیات بعداً تبدیل می‌شود به کد CPU

پس رشته‌ها در C++ با یک هدر فایل و لایبرری اضافه شده‌اند
و ذات خود زبان، رشته را به‌عنوان نوع داده‌ی پایه ندارد.


🔵 3. پس رشته از نگاه زبان چیست؟ (تعریف واقعی و پایه‌ای)

اگر بخواهیم دقیق توضیح بدهیم:

رشته یعنی مجموعه‌ای از چند «کاراکتر» کنار هم.

مثلاً "ABC"

  • کاراکتر A

  • کاراکتر B

  • کاراکتر C

رشته = مجموعه‌ای از کاراکترها

در C و C++ ما نوع داده‌ای به نام:

char c = 'A';

داریم.
این یک کاراکتر است.

حالا اگر بخواهیم چند کاراکتر کنار هم بگذاریم، چه چیزی داریم؟

یک آرایه از کاراکترها.

بله!
تعریف واقعی رشته در C و C++ :

string = یک آرایهٔ char + یک کاراکتر پایان‌دهنده


🔵 4. ساخت رشته بدون string (روش سنتی و پایه‌ای)

می‌توانیم یک رشته را با آرایهٔ char بسازیم:

char s[6] = "salam";

چرا ۶؟
چون:

  • s

  • a

  • l

  • a

  • m

  • \0 ← نول ترمینیتور (کاراکتر پایان رشته)

همهٔ رشته‌های زبان C و C++ باید این کاراکتر پایان را داشته باشند.
بدون \0 رشته‌ای وجود ندارد.


🔹 چرا باید نول ترمینیتور داشته باشد؟

زیرا زبان باید بفهمد رشته کجا تمام می‌شود.
اگر این \0 نباشد، زبان ادامهٔ حافظه را می‌خواند تا زمانی که شانسی به صفر برسد و این باعث خطا می‌شود.

مثال:

char name[5] = "Ali"; // اشتباه

کامپایلر خطا می‌دهد، چون طول کافی ندارد.

نسخهٔ درست:

char name[4] = "Ali"; // A L i \0 (4 خانه)

🔵 5. در پشت صحنه: string دقیقاً چگونه کار می‌کند؟

وقتی می‌نویسی:

string s = "Tabz Media";

در حقیقت:

  • یک آرایهٔ کاراکتر ساخته می‌شود

  • مقداردهی می‌شود

  • پشت صحنه نول ترمینیتور گذاشته می‌شود

  • یک سری توابع و امکانات اضافه در اختیار تو قرار می‌گیرد
    مثل:

    • s.length()

    • s.substr()

    • s.find()

    • و...

در واقع string فقط یک کلاس پیشرفته است که روی آرایهٔ char ساخته شده.


🔵 6. کار با آرایهٔ کاراکتر (درک کامل نحوهٔ شکل‌گیری رشته)

مثال آموزشی:

char name[6] = "salam"; cout << name;

اجرای آن رشته را چاپ می‌کند.
چرا؟

چون:

  • ۵ کاراکتر اصلی دارد

  • خانهٔ ششم = \0 (اتمام رشته)

اگر آن \0 نباشد، کد یا خطا می‌دهد یا اطلاعات اضافی چاپ می‌کند.


🔵 7. پس بالاخره از «string» استفاده کنیم یا «char array»؟

پاسخ:

  • برای یادگیری مفاهیم بنیادی → char array

  • برای پروژه واقعی، کار کاربردی، و ساخت برنامه → string

چرا؟

چون:

  • نوشتن با char array سخت است

  • مدیریت نول ترمینیتور همیشه دردسر دارد

  • امکانات string بسیار بیشتر و امن‌تر است

  • string بهینه طراحی شده و سرعت خوبی دارد

  • خوانایی کد بهتر می‌شود


🔵 8. جمع‌بندی نهایی

  1. C/C++ ذاتاً نوع رشته ندارند.

  2. رشتهٔ واقعی = آرایهٔ char که با \0 تمام می‌شود.

  3. string از طریق هدر <string> اضافه شده و یک کلاس پیشرفته است.

  4. در پشت صحنه، string همان آرایهٔ کاراکتر است اما با امکانات بیشتر.

  5. برای درک ماهیت رشته‌ها ابتدا آرایهٔ کاراکتر را یاد می‌گیریم.

  6. سپس می‌توانیم راحت، امن و حرفه‌ای از string استفاده کنیم.

لطفا برای گذاشتن نظرات خود وارد شوید

نظرات شما عزیزان