
آموزش کار با رشته ها در سی پلاس پلاس (کتابخانه string)
یکی از ویژگی های مهم زبان برنامه نویسی سی پلاس پلاس نسبت به زبان سی، وجود کلاس و نوع داده string (رشته) است. با ما همراه باشید تا کلاس رشته در سی پلاس پلاس را بررسی کنیم.
فهرست مطالب
رشته ها
وجود نوع داده رشته کار با کاراکتر ها و متن ها را بسیار آسان می کند و با متد هایی که در اختیار می گذارد برنامه نویسی را برای ما بسیار شیرین و جذاب می کند؛ همچنین مانع آن می شود که وقت ما برای نوشتن خیلی از توابع به هدر برود.
کلاس رشته در سی پلاس پلاس
برای اینکه بتوانیم از رشته ها (String) استفاده کنیم باید هدر یا کتابخانه آن را به برنامه متصل کنیم :
1 | #include <string> |
string (رشته) نوعی گونه اطلاعاتی است که کاراکتر یا کاراکتر هایی را در خود نگه می دارد مثل "123" و "ABC" و "!Hello, World" و "n\" و "" و " " .
برای ساختن شی از نوع رشته باید مانند خط زیر عمل کنیم:
1 | string str1 = "Football is my favourite sport,you can play Football every place."; |
در بالا من رشته ای به اسم str1 ایجاد کرده ام که مقدار “Football is my fav sport,you can play Football every place.” دارد.
توابع عضو کلاس رشته
حالا که ایجاد یک رشته را یاد گرفتیم می ریم سراغ متد ها و توابع مربوط به رشته ها تا ببینیم چطور می شود رشته ها را دستکاری کاری کرد و تغییراتی روی آنها انجام داد .
تابع عضو size
تابع size() تعداد کاراکتر های یا همان طول رشته را به عنوان خروجی برمی گرداند و اینگونه استفاده می شود :
1 | str1.size() |
تابع عضو empty
متد empty می گه که رشته خالی است یا پر اگر تابع مقدار یک را برگرداند یعنی رشته هیچ کاراکتری ندارد و مساوی “” است ، نحوه ی استفاده از آن را در پایین می بینید:
1 | str1.empty() |
عملگر [ ] ( operator [])
رشته ی str1 را که در بالا تعریف کردیم را در نظر بگیرید فرض کنید می خواهید به کاراکتر ششم آن دسترسی داشته باشید و از آن استفاده کنید یا آن را تغییر دهید این موقع است که از اپراتور [ ] به مانند زیر استفاده می کنیم :
1 | " lang="c++" decode="true" dir="ltr"] str1[5] |
شاید برای شما این سوال پیش بیاید چرا من گفتم کاراکتر ششم ولی تو خط بالا نوشتم ۵، دلیلش این است که در سی پلاس پلاس کاراکتر ها شمارشون از صفر شروع می شود.
تابع عضو (append(string
این تابع عضو رشته ای را که درون پرانتز آمده به ته رشته ای که این تابع روی آن انجامم شده اضافه می کند طریقه ی استفاده :
1 | str1.append(str2); |
تابع عضو (erase(int i,int j
این تابع از کاراکتر i ام به اندازه j کاراکتر از رشته پاک می کند مانند قطعه کد زیر :
1 | str1.erase(24,34); |
تابع عضو (& insert(int n,const sting
این تابع از کاراکتر n رشته ای که این تابع روی آن آمده شروع می کند به وارد کردن یک رشته :
1 | str1.insert(25,"basketball is better."); |
تابع عضو (find(string
این تابع از سمت چپ رشته شروع به سرچ می کند تا رشته ای را که در بین دو پرانتز آمده را پیدا کند ،توجه کنید که به محض رسیدن به اولین تشابه دیگر کار را ادامه نمی دهد .بعد از پیدا کردن رشته مورد نظر در آن یکی رشته مکانی که اولین خانه زیر رشته از آن شروع می شود را برمی گرداند.
1 | str1.find("is") |
عملگر +
با استفاده از این عملگر می توانید دو رشته را به هم متصل کنید مانند مثال زیر :
1 2 3 4 | string str3 = "a"; string str4 = "b"; string str5 = ""; str5 = str3 + str4; |
عملگر +=
این عملگر مانند تابع append که در بالا آمده است عمل می کند به مثال زیر توجه کنید :
1 | str5 += str3; |
این عملگر str3 را به ته str5 اضافه می کند.
تابع عضو (compare(string
این تابع رشته ای را که تابع رویش عمل می کند با رشته درون پرانتز مقایسه می کند اگر مساوی بودند عدد ۰ بازگردانده می شود اگر رشته درون پرانتز بزرگ تر بود عدد ۱ اگر نه عدد -۱ باز گردانده می شود .نحوه استفاده را می بینید :
1 | str1.compare(str2) |
متد clear
متد clear هم محتویات درون آرایه را پاک می کند یا به عبارتی مساوی “” قرار می دهد .
مثال کاربردی از توابع عضو کلاس string
در زیر نمونه کدی از همه ی آنچه در بالا گفته شد می بینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | // string C++.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> using namespace std; int main() { //init string string str1 = "Football is my fav sport,you can play Football every place."; string str2 = "don't play football in bad battle,it is dangerous."; //.size() show length of string cout<< str1.size()<< endl<< endl; //.empty() if string is empty return 1 else return 0. cout<< str1.empty()<< endl<< endl; //operator [] :you can access to i th character. cout<< str1[5]<< endl<< endl; //.append(string ) :append string to end of other string. str1.append(str2); cout<< str1<< endl<< endl; //.erase(int i,int j) :Delete form character i th and reply that j time. str1.erase(24,34); cout<< str1<< endl<< endl; //.insert(int n,const sting &) : from character n program start embed new string in other string. str1.insert(25,"basketball is better."); cout<< str1<< endl<< endl; //.find(string) search string form left in other string and return position of it. cout<< str1.find("is")<< endl<< endl; //.rfind(string) search string form right in other string and return position of it. cout<< str1.rfind("is")<< endl<< endl; //operator + : you can connect too string or more by + string str3 = "a"; string str4 = "b"; string str5 = ""; str5 = str3 + str4; cout<< str5<< endl<< endl; //operator += :like .append(string ) str5 += str3; cout<< str5<< endl<< endl; //.compare(string) : do comparison operator on two string if two string equal return 0 if first was bigger than other return -1 else return +1. cout<< str1.compare(str2)<< endl<< endl; //.clear() :assign string to "". str1.clear(); cout<< str1<< endl<< endl; } //open-mind.ir |
سلام ممنون از آموزش خوبتون
یه سوالی داشتم اگر مثلا بخوام توی شرط بررسی کنم اگر رشته ای آخرش به فلان کاراکترها ختم شد فلان کار رو انجام بده…این راه حلی داره؟؟
مثلا اینجوری: اگه رشته مورد نظر به “ing” ختم شده فلان دستور رو انجام بده…
این شدنیه؟
سلام
خواهش می کنم
راه حل سریعی که الان به ذهنم میرسه به این صورت هستش که باید به طول همون “فلان کاراکترها” از انتهای رشته جدا کنید و بعد تساوی رو بررسی کنید.
راه حل کمی کند هم استفاده از عبارات منظم یا همون regular expressions هاست.
اما اگر تعداد کاراکترهایی که درنظر دارید در رشته پیداشون کنید، کوتاهه (مثل همون “ing” که مثال زدید)، می تونید دونه به دونه سه کاراکتر آخر رو داخل شرط با عملگر برابری تست کنید.
موفق باشید
درود بر شما
بسیار مفید بود و واقعا سپاسگزارم
سلام مرسی از توضیحات خوبتون یه سوال داشتم تابعی داریم مثل string باشه ولی بشه بهش عدد داد ؟؟؟؟
سلام. خواهش می کنیم. امیدواریم که مفید بوده باشه
شما می تونید داخل یک شی string اعداد رو هم ذخیره کنید. اعداد به شکل مجموعه ای از کاراکترها ذخیره میشند و خودتون می تونید توابعی برای انجام عملیات روی این رشته های عددی (اعداد بسیار بزرگ) تعریف کنید.
سلام
خیلی ممنون از آموزش هاتون
آموزش رشته های C++ خیلی به کارم اومد اونم وقتی که از سر وکله زدن با رشته های C له شده بودم!!
سلام
یه سوال داشتم جوابشو لطفا هرکس میدونه ایمیل بزنه
برنامه ای که از کاربر یه حرف یا یه کلمه یا یه جمله همراه با عدد بگیره بعد اون عبارت رو به تعداد عدد چاپ کنه مثلا
Ali(2) ali ali
Salam ali salam ali salam ali
اول مشخص میکنیم ک مثلا عدد تو عنصر اول بزنه بعد با توجه ب این ک اعداد قبل جنبه محاسباتی بودن ی کاراکتر هستن میتونیم بگیم ک این رشته رو ب اندازه درایه اول چاپ کن و درایه اول چون عدد چاپ میکنه 🙂 ینی با ی فور ک ب درایه اول رشته محدودش مبکنیم
سلام
باتشکر از توضیحات خوبتون
fillellipse(x[0],y[0],r,r
معنی این کد توو محیط گرافیکی چیه؟
یه بیضی می کشه، https://msdn.microsoft.com/en-us/library/system.drawing.graphics.fillellipse%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
آیا تابعی در سی پلاس پلاس هست که بتونم کل محتوای یک فایل متنی رو یکجا بخونم ودر یک متغیر ازنوع
کلاس استرینگ بریزم..با تابع گت لاین نمیشه چون این تابع فقط تا اینتر رو میخونه ولی من کل متن رو میخوام
بله هست ، در کتابخانه ی STl دقیق یادم نیست کتابخونش رو بگردی پیدا می کنی فکر کنم copy بود
به جای این سه fstream::in |fstream::out |fstream::app میشه فقط یه ios::in گذاشت حداقل تو این برنامه
با سلام اگه میشه یه مثال برای متد 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 استفاده کرده باشم برنامه خطا می ده و بسته می شه و می گوید که خانه ای می خوام دسترسی داشته باشم که در دامنه ی رشته نیست، ولی اگر از اون یکی روش استفاده کنم برنامه بالاخره یک مقداری از حافظه می خونه و برمی گردونه و برنامه به کار خودش ادامه می ده و من متوجه ی اشکال نمی شم.
سلام
ببخشید یه سوال داشتم واسه فرم سی شارپ من یک نرم افزار نوشتم اگر بخوام فرمش به حالت زیباتری و با کیفیت تری در بیاید شما کامپوننتی سراغ دارید مثلا برای وارد کردن یوزر و پسورد فرمی میخوام که حالت قفل داشته باشه و ازین موارد ؟
ممنون
به برنامه Blend مراجعه کنید
سسلام
ببخشید دو تا سسوال داشتم
اول اینکه یک منبع آموزشی خوب واسه 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 چی؟
رشته ی “abcdefgh” را در نظر بگیرید ، “cde” , “ab” , “f” و … زیر رشته های آن هستند.
سلام می خواهم یک double را واردstring کنم جه طور این کار را انجام دهم؟؟
اگر از ویژوال سی پلاس پلاس استفاده می کنی با تابع to_string این کار رو بکنم اگر نه خودت باید یک برنامه بنویسی که تک تک رقمی های عدد را تبدیل به یک کاراکتر کند بعد آن کاراکتر ها را در قالب یک رشته کنار هم بگذارد
برای این تبدیل، خواندن این مطلب مفید خواهد بود:
جریان رشته (string stream) در ++C
سلام….خواهش میکنم جواب این سوال را بدید…
برنامه ای بنویسید که کاراکتری بین حروف a تا z از ورودی دریافت کرده سپس به کاربر اعالام کند که چندمین حرف الفبا بوده است؟
برای این کار کد اسکی حرف گرفته شده را از کد a (یا A) کم می کنیم (و به اضافه یک، برای داشتن مفهوم چندمین) و چاپ می کنیم. حالت هایی که حرف داده شده بزرگ یا کوچک یا اصلاً حرف الفبا نباشد هم در نظر گرقته شده است.
برای آزمایش این کد به آدرس http://cpp.sh/3y2c برید و دکمه run را بزنید و یک کاراکتر وارد کنید تا نتیجه را ببینید.
جدول کدهای اسکی هم در این آدرس http://www.asciitable.com قابل مشاهده هستند.
char x;
cin>>x;
int a=0
for(char i=a;a<=z;i++)
{
a++;
if(i==x)
break;
else
continue;
}
cout<<a;
البته این برایه حروف کوچک هستش!
می خوام از یک فایل خیلی بزرگ خطوط مشخصی رو هربار با استفاده از یک کارکتر بخونم
میخوام از فایل بالا بر حسب عداد هر تعداد خط که مربوط به عدد موردنظر هست رو بخونیم.
چون متغیر هستند نمیدونم چطور مقدار مشخصی از آرایه رو برای نگهداریشون مشخص کنم و مسائل حافظه رو رعایت کنم.
فرض کن اسم فایل fp است و می خواهی یک خط از آن را بخوانی و در رشته ی str بریزی باید این کار را بکنی
با روش بالا می تونی خط ها رو بخونی
اگر هم نمی دونی چطور آرایه پویا درست کنی می تونی توی اینترنت سرچ کنی ++How to make dynamic array in c یا می تونی از وکتور استفاده کنی :
آموزش استفاده از وکتور (vector) در زبان ++C
هنوز منتظر مبحث stream هستم و البته درباره فایل های باینری هم بنویسید ممنون
یه سوال
کد بالا ظاهرا سازنده stringstream میاد و بر حسب اسپیس رشته رو جدا میکنه حالا اگه یکی اسم فامیلش دو قسمتی باشه چطور میشه از این استفاده کرد بدون تعریف متغیر جدید
سلام
مطلب string stream در حال آماده سازی هستش اما انتشارش کمی طول میکشه
جواب سوال شما هم میتونه به این صورت باشه که وقتی از mystream نام رو استخراج کردین، مقدار باقی مونده در stream، نام خانوادگی هستش و برای استخراج کامل نام خانوادگی میشه از متد ()str که در کلاس stringstream تعریف شده استفاده کرد و تمام باقی مونده جریان رشته به string تبدیل میشه. کد مورد نظر شما:
سلام دوستان
لطفا کمکم کنید
برنامه ای بنویسیدکه به کمک یک تابع وجود یا عدم وجود یک رشته در رشته دیگر را نشان دهد؟
C++
توی رشته می ری جلو تا اولین کاراکتر از رشته ی دومت رو ببینی بعد از اون چک می کنی کاراکتربعدی همان کاراکتر در رشته ی دوم هست یا و همین طور تا آخر و اگر نبود باز توی رشته ادامه می دهی تا اولین کاراکتر از رشته ی دومت را ببینی .
میشه در مورد sstream هم بنویسید .
حتماً در چند روز آینده می نویسیم. ولی فعلاً چند منبع سریع و مناسب به شما معرفی می کنم.
http://www.cplusplus.com/reference/sstream/stringstream
http://en.cppreference.com/w/cpp/io/basic_stringstream
مطلب جریان رشته منتشر شد!
جریان رشته (string stream) در ++C
slm khasete nabashid
baraye inke bkham adade daroone do reshte ro jam konm bayad chikar konm
mamnoon misham rahnamayim konid
باید عدد ها رو که به صورت رشته هستند به صورت عدد در آوری ، خودت می تونی خیلی راحت برایش یک تابع بنویسی، فرض کن کاراکتر زیر را داری و می خواهی ببینی چه عدد درونش هست.باید این کار را کنی:
به روش بالا کاراکتر رو به عدد تبدیل کردی ، حالا یک تابع بنویس که برای تک تک کاراکتر های رشته این کار را کند
چطور میشه string را به int تبدیل کرد؟
با فرض اینکه منظور شما تبدیل در زبان ++C است و رشته شما شامل اعداد است اینطور میشود تبدیل کرد:
که str رشته فرضی است.
برای اطلاعات بیشتر بخوانید:
روش ارائه شده در این مطلب هم مفید خواهد بود:
جریان رشته (string stream) در ++C
tnx. was helpfull
سلام
من یه متغییر نوع string تعریف کردم
و می خوام بهش رشته ای رو بدم اما انجام نمیده
مشکلش از کجاس؟
و چجوری می تونم اینکارو بکنم؟
رشته رو فقط تا اولین فاصله میخونه.
بله تا اولین فاصله می خونه برای اینکه تو سی پلاس پلاس رشته رو کامل بخونی و فاصله ها هم بخونی با این طوری بنویسی
تشکر از پست خوبت ،چند وقته می خواستم سترینگ سی پلاس پلاس رو یاد بگیرم حال نداشتم برنامه های درسیمو با روش آرایه ای از کاراکتر ها می نوشتم راستی چند تا سوال خوب برای کار با استرینگ بده
خوشحالم از این که تونستم کمک کنم.بهترین منبع برای تمرین استرینگ بخش string کتاب programming challenges است .
معرفی کتاب Programming challenges و پروژه حکیم فردوسی :
http://open-mind.ir/?p=223