کار با string (رشته) در ++C

 string

یکی از ویژگی های مهم زبان برنامه نویسی سی پلاس پلاس نسبت به زبان سی وجود کلاس و نوع داده string (رشته) است که کار با کاراکتر ها و متن ها را بسیار آسان می کند و با متد هایی که در اختیار می گذارد برنامه نویسی را برای ما بسیار شیرین و جذاب می کند و مانع آن می شود که وقت ما برای نوشتن خیلی از توابع به هدر برود.

برای اینکه بتوانیم از رشته ها (String)   استفاده کنیم  باید هدر یا کتابخانه آن را به برنامه متصل کنیم :

string  (رشته)  نوعی گونه اطلاعاتی است که کاراکتر یا کاراکتر هایی را در خود نگه می دارد مثل  “Hello world” ,  “A” , “1” , ” ” ,  “”  .

برای ساختن شی از نوع رشته باید مانند خط زیر عمل کنیم:

در بالا من رشته ای به اسم str1  ایجاد کرده ام که مقدار “Football is my fav sport,you can play Football every place.” دارد.

حالا که ایجاد یک رشته را یاد گرفتیم می ریم سراغ متد ها و توابع مربوط به رشته ها تا ببینیم چطور می شود رشته ها را دستکاری کاری کرد و تغیراتی روی آن ها انجام داد .

تابع عضو  .size() :

تابع size() تعداد کاراکتر های یا همان طول رشته را به عنوان خروجی برمی گرداند و اینگونه استفاده می شود :

تابع عضو .empty() :

متد empty می گه که رشته خالی است یا پر اگر تابع مقدار یک را برگرداند یعنی رشته هیچ کاراکتری ندارد و مساوی “” است ، نحوه ی استفاده از آن را در  پایین        می بینید:

عملگر [ ]  ( oprator []) :

رشته ی str1  را که در بالا تعریف کردیم را در نظر بگیرید فرض کنید می خواهید به کاراکتر ششم آن دسترسی داشته باشید و از آن استفاده کنید یا آن را تغییر دهید این موقع است که از اپراتور [ ]  به مانند زیر استفاده می کنیم :

شاید برای شما این سوال پیش بیاید چرا من گفتم کاراکتر ششم ولی تو خط بالا نوشتم ۵، دلیلش این است که  در سی پلاس پلاس کاراکتر ها شمارشون از صفر شروع می شود.

تابع عضو  (append(string .  :

این تابع عضو رشته ای را که درون پرانتز آمده به ته رشته ای که این تابع روی آن انجامم شده اضافه می کند طریقه ی استفاده :

تابع عضو (erase(int i,int j . :

این تابع از کاراکتر  i  ام به اندازه  j  کاراکتر از رشته  پاک می کند  مانند قطعه کد زیر :

تابع عضو   (& insert(int n,const sting  :

این تابع از کاراکتر n  رشته ای که این تابع روی آن آمده شروع می کند به وارد کردن یک رشته :

تابع عضو ( find(string   . :

این تابع از سمت چپ رشته شروع به سرچ می کند تا رشته ای را که در بین دو پرانتز آمده را پیدا کند ،توجه کنید که به محض رسیدن به اولین تشابه دیگر کار را ادامه نمی دهد .بعد از پیدا کردن رشته مورد نظر در آن یکی رشته مکانی که اولین خانه زیر رشته از آن شروع می شود را برمی گرداند.

عملگر operator + :

با استفاده از این عملگر می توانید دو رشته را به هم متصل کنید مانند مثال زیر :

 

عملگر operator +=  :

این عملگر مانند تابع append که در بالا آمده است عمل می کند به مثال زیر توجه کنید :

این عمگر str3  را به ته str5  اضافه می کند.

 

تابع عضو  (compare(string  .  :

این تابع رشته ای را که تابع رویش عمل می کند با رشته درون پرانتز مقایسه می کند اگر مساوی بودند عدد ۰ بازگردانده می شود اگر رشته درون پرانتز بزرگ تر بود عدد ۱ اگر نه عدد -۱ باز گردانده می شود .نحوه استفاده را می بینید :

متد clear   هم محتویات درون  آرایه را پاک می کند یا به عبارتی مساوی “”  قرار می دهد .

در زیر نمونه کدی از همه ی آنچه در بالا گفته شد می بینید

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۵۷ comments

  • سلام
    یه سوال داشتم جوابشو لطفا هرکس میدونه ایمیل بزنه
    برنامه ای که از کاربر یه حرف یا یه کلمه یا یه جمله همراه با عدد بگیره بعد اون عبارت رو به تعداد عدد چاپ کنه مثلا
    Ali(2) ali ali
    Salam ali salam ali salam ali

  • سلام
    باتشکر از توضیحات خوبتون

    fillellipse(x[0],y[0],r,r
    معنی این کد توو محیط گرافیکی چیه؟

  • آیا تابعی در سی پلاس پلاس هست که بتونم کل محتوای یک فایل متنی رو یکجا بخونم ودر یک متغیر ازنوع
    کلاس استرینگ بریزم..با تابع گت لاین نمیشه چون این تابع فقط تا اینتر رو میخونه ولی من کل متن رو میخوام

    • فرهاد دلیرانی

      بله هست ، در کتابخانه ی STl دقیق یادم نیست کتابخونش رو بگردی پیدا می کنی فکر کنم copy بود

  • با سلام اگه میشه یه مثال برای متد erase() بزنید . و لطف کنید بگید فایل سرآیندش چیه .

    • محمد جمالی

      // string::erase
      #include
      #include

      int main ()
      {
      std::string str (“This is an example sentence.”);
      std::cout << str << '\n'; str.erase (10,8); std::cout << str << '\n'; str.erase (str.begin()+9); std::cout << str << '\n'; str.erase (str.begin()+5, str.end()-9); std::cout << str << '\n'; return 0; }

  • سلام خدمت دوستان عزیز ی سوال داشتم چندوقته بهش فکرمیکنم ولی به نتیجه مطلوب نرسیدم…
    در زبان سی شارپ میخوام برنامه بنویسم که چند دانشجو با نام و شماره دانشجوی و معدل بگیره و بزرگترین معدل رو حساب کنه و بزرگترین معدل رو با نام و شماره دانشجویی چاپ کنه…
    تمام مراحلش رو انجام دادم فقط نمیتونم نام و شماره دانشجویی بزرگترین معدل رو چاپ کنم…ممنون میشم اگ بتونید کمک کنید..باتشکر

    • محمد جمالی

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

      اما اگر در چاپ مشکل دارید کد خود را به ما ایمیل کنید تا برسی شود

  • درود و خسته نباشی
    ی سوال :
    اگه بخوایم عدد های یک رشته رو حذف کنیم باید چ کنیم؟!؟
    مثلا mp7rin56ce رو به mprince تبدیل کنیم!!!

    • فرهاد دلیرانی

      به کد زیر دقت کنید :

  • کارتون ۲۰ـه ۲۰ـه ۲۰ـه

  • سلام. یه سوال داشتم.
    string s = “mohammad”;
    فرق بین
    s.at(5)
    و
    s[5]
    چیه؟
    tnx

    • فرهاد دلیرانی

      رشته ی S که خودت تعریف کردی هشت کاراکتر، فرض کن در حین برنامه من بگم خانه ی ده رشته رو برگردون، اگر از تابع at استفاده کرده باشم برنامه خطا می ده و بسته می شه و می گوید که خانه ای می خوام دسترسی داشته باشم که در دامنه ی رشته نیست، ولی اگر از اون یکی روش استفاده کنم برنامه بالاخره یک مقداری از حافظه می خونه و برمی گردونه و برنامه به کار خودش ادامه می ده و من متوجه ی اشکال نمی شم.

  • سلام
    ببخشید یه سوال داشتم واسه فرم سی شارپ من یک نرم افزار نوشتم اگر بخوام فرمش به الت زیباتری و با کیفیت تری در بیاید شما کامپوننتی سراغ دارید مثلا برای وارد کردن یوزر و پسورد فرمی میخوام که حالت قفل داشته باشه و ازین موارد ؟
    ممنون

  • سسلام
    ببخشید دو تا سسوال داشتم
    اول اینکه یک منبع آموزشی خوب واسه install sheild 2012 اگر سراغ دارید معرفی کنید؟
    دوم اینکه من یک نرم افزار به زبان سی شارپ ساختم میخواستم واسه این نرم افزارمم فعال سازی اینترنتی بزارم میخواستم بدونم واسه نوشتن کدش از کجا و چجوری باید شروع کنم واسه اینکه یک فعال سازی اینترنتی بنوسم واسسش و اینکه چه ویژگی هایی باید داشته باشه این فعال سازی اینترنتی به زبان سی شارپ و کلا یک راهنمایی واسه نوشتنش میخواستم
    باتشکر

    • محمد جمالی

      موارد زیر را رعایت کنید :
      ۱- اطلاعات بین برنامه و سرور کد شده ارسال شود ( مباحث کدگذاری )
      ۲- برای ارسال داده های به سرور از سوکت استفاده کنید … ( البته سی شارپ امکانات دیگری برای ارسال داد به سرور را دارد که نیازی به سوکت پیدا نکنید : ارسال با متد POST)
      ۳- شما باید بتوانید تشخیص دهید داده ای که دریافت میکنید معتبر است ! پس یک الگوریتم در سرور و مکملی از آن را در برنامه قرار دهید که با استفاده از آن صحت داده ها را تشخیص دهید
      ۴- داده هایی را که در سیستم ذخیده میکنید کد گذاری کرده و برای هر سیستم با توجه به مشخصات سخت افزاری منحصر به فرد کنید ! تا با یک بار فعال سازی کد فعال سازی برنامه شما افشا نشود

      این مواردی بود که به ذهنم رسید
      امیدوارم موفق باشید

  • با سلام و خسته نباشید
    یک سوال در مورد رشته ها داشتم میخواستم ببینم چجوری دو تا رشته را میتوان با هم ترکیب کرد این سوال در رابطه با این برنامه هست (مربوط به برنامه نویسی پویا در طراحی الگوریتم)
    **الگوریتمی که رشته های x,y,sرا دریافت کند و مشخص کند آیا s ترکیبی از x,y هست یا خیر ؟

    لطفا راهنمایی بفرمایید
    با تشکر

    • محمد جمالی

      ترکیب به روش های مختلفی انجام میشود !
      سخت ترین نوع آن ترکیبی از تکه تکه شدن x y به شکلی است که ترتیب آن ها هم تغییر کند ! ساده ترین راه برای آن این است که به ترتیب از ابتدای s شروع کنیم و برای هر کاراکتر آن یک بار در x y جست و جو کنیم و اگر آن را پیدا کردیم از x y حذف کنیم یا با کاراکتری بی ارزش جایگزین کنیم و اگه کاراکتر را در آن دو پیدا نکردیم یعنی ترکیبی از آن دو نیست اگه تمام کاراکتر ها را برسی کردیم اما هنوز در x y کاراکتری موجود بود یعنی باز هم ترکیبی نیست در غیر این صورت ترکیب است

      موفق باشید

  • سلام
    اگه بخوام رو تک تک کارکترا یه تغیری به وجود بیارم مثلا کد اسکی هر کدوم رو دو برابر کنم چه راهی پیشنهاد میکنی؟

    • محمد جمالی

  • سلام
    منمون به خاطر مطالب خوبتون.
    یک سوال اینکه فرض کنید یک string دارین بعد حالا می خواین کاراکتر i ام اونو وسط یک string دیگه اضافه کنید اونوقت باید چی کار کرد؟؟
    کد من ای شکلی بود جواب نمی ده.
    ;string s , d
    ;int i,j
    ;cin>>s
    ;([d.insert(j,s[i
    ;cout<<d

    • محمد جمالی

  • bbakhshid mishe lotfan tozih bedid k substring chie?! mersi

    ویرایش : ببخشید می شه توضیح بدید substring چی؟

  • سلام می خواهم یک double را واردstring کنم جه طور این کار را انجام دهم؟؟

  • سلام….خواهش میکنم جواب این سوال را بدید…
    برنامه ای بنویسید که کاراکتری بین حروف a تا z از ورودی دریافت کرده سپس به کاربر اعالام کند که چندمین حرف الفبا بوده است؟

    • برای این کار کد اسکی حرف گرفته شده را از کد a (یا A) کم می کنیم (و به اضافه یک، برای داشتن مفهوم چندمین) و چاپ می کنیم. حالت هایی که حرف داده شده بزرگ یا کوچک یا اصلاً حرف الفبا نباشد هم در نظر گرقته شده است.

      برای آزمایش این کد به آدرس http://cpp.sh/3y2c برید و دکمه run را بزنید و یک کاراکتر وارد کنید تا نتیجه را ببینید.
      جدول کدهای اسکی هم در این آدرس http://www.asciitable.com قابل مشاهده هستند.

  • می خوام از یک فایل خیلی بزرگ خطوط مشخصی رو هربار با استفاده از یک کارکتر بخونم

    میخوام از فایل بالا بر حسب عداد هر تعداد خط که مربوط به عدد موردنظر هست رو بخونیم.
    چون متغیر هستند نمیدونم چطور مقدار مشخصی از آرایه رو برای نگهداریشون مشخص کنم و مسائل حافظه رو رعایت کنم.

    • فرهاد دلیرانی

      فرض کن اسم فایل fp است و می خواهی یک خط از آن را بخوانی و در رشته ی str بریزی باید این کار را بکنی

      با روش بالا می تونی خط ها رو بخونی
      اگر هم نمی دونی چطور آرایه پویا درست کنی می تونی توی اینترنت سرچ کنی ++How to make dynamic array in c یا می تونی از وکتور استفاده کنی :
      آموزش وکتور

  • هنوز منتظر مبحث stream هستم و البته درباره فایل های باینری هم بنویسید ممنون
    یه سوال

    کد بالا ظاهرا سازنده stringstream میاد و بر حسب اسپیس رشته رو جدا میکنه حالا اگه یکی اسم فامیلش دو قسمتی باشه چطور میشه از این استفاده کرد بدون تعریف متغیر جدید

    • سلام
      مطلب string stream در حال آماده سازی هستش اما انتشارش کمی طول میکشه
      جواب سوال شما هم میتونه به این صورت باشه که وقتی از mystream نام رو استخراج کردین، مقدار باقی مونده در stream، نام خانوادگی هستش و برای استخراج کامل نام خانوادگی میشه از متد ()str که در کلاس stringstream تعریف شده استفاده کرد و تمام باقی مونده جریان رشته به string تبدیل میشه. کد مورد نظر شما:

  • سلام دوستان
    لطفا کمکم کنید

    برنامه ای بنویسیدکه به کمک یک تابع وجود یا عدم وجود یک رشته در رشته دیگر را نشان دهد؟
    C++

    • فرهاد دلیرانی

      توی رشته می ری جلو تا اولین کاراکتر از رشته ی دومت رو ببینی بعد از اون چک می کنی کاراکتربعدی همان کاراکتر در رشته ی دوم هست یا و همین طور تا آخر و اگر نبود باز توی رشته ادامه می دهی تا اولین کاراکتر از رشته ی دومت را ببینی .

  • میشه در مورد sstream هم بنویسید .

  • slm khasete nabashid
    baraye inke bkham adade daroone do reshte ro jam konm bayad chikar konm
    mamnoon misham rahnamayim konid

    • فرهاد دلیرانی

      باید عدد ها رو که به صورت رشته هستند به صورت عدد در آوری ، خودت می تونی خیلی راحت برایش یک تابع بنویسی، فرض کن کاراکتر زیر را داری و می خواهی ببینی چه عدد درونش هست.باید این کار را کنی:

      به روش بالا کاراکتر رو به عدد تبدیل کردی ، حالا یک تابع بنویس که برای تک تک کاراکتر های رشته این کار را کند

  • چطور میشه string را به int تبدیل کرد؟

  • سلام
    من یه متغییر نوع string تعریف کردم
    و می خوام بهش رشته ای رو بدم اما انجام نمیده
    مشکلش از کجاس؟
    و چجوری می تونم اینکارو بکنم؟

  • تشکر از پست خوبت ،چند وقته می خواستم سترینگ سی پلاس پلاس رو یاد بگیرم حال نداشتم برنامه های درسیمو با روش آرایه ای از کاراکتر ها می نوشتم راستی چند تا سوال خوب برای کار با استرینگ بده

Leave a Reply

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *