نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

نوع داده رشته ای در C. رشته ها در C

اعلامیه های رشته ای

رشته در زبان C آرایه‌ای تک بعدی از کاراکترها است که آخرین عنصر آن کاراکتر انتهای خط - صفر (رشته‌ای با پایان تهی، یعنی رشته پایان‌یافته NULL) است.

آگهی متغیر نوعیک رشته در C به سه روش امکان پذیر است که دو تای آن رشته را در زمان اعلان مقداردهی اولیه می کند.

راه اول:

اعلان های آرایه کاراکتر (فراموش نکنید که برای خالی پایانی فاصله اضافه کنید):

کاراکترها

راه دوم:

به متغیر رشته اختصاص دهید مقدار اولیه(در همان زمان، کامپایلر می تواند طول خود رشته را محاسبه کند):

Char s = "مثال مقداردهی اولیه رشته";

در سمت راست علامت تخصیص یک رشته ثابت وجود دارد. یک صفر ('\0') به طور خودکار به انتهای رشته اضافه می شود. ثابت های رشته کاراکتری در یک کلاس ذخیره سازی ایستا قرار می گیرند.

راه سوم:

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

Char *s="گزینه اولیه اولیه";

متغیر s یک اشاره گر به آن مکان در خواهد بود حافظه دسترسی تصادفی، جایی که ثابت رشته قرار دارد. این شکل از علامت گذاری دارای یک خطای بالقوه است که نشانگر یک کاراکتر اغلب به عنوان یک رشته نامیده می شود. ورودی زیر فقط یک اشاره گر به یک کاراکتر است، زیرا هیچ فضایی برای رشته وجود ندارد:

Char*s;

وارد کردن یک رشته از دستگاه ورودی استاندارد (صفحه کلید)

مجموعه ای از توابع برای کار با رشته ها وجود دارد. برای ورودی از دستگاه ورودی استاندارد (صفحه کلید)، توابع کتابخانه از ماژول ورودی / خروجی استاندارد بیشتر استفاده می شود: scanfو می شود.

برای وارد کردن یک رشته با استفاده از تابع scanf، از فرمت استفاده می کند « %s» و توجه داشته باشید که علامت آدرس قبل از شناسه ردیف استفاده نمی شود « & » ، از آنجایی که یک آرایه یک بعدی قبلاً با یک اشاره گر به ابتدای آن نشان داده شده است:

scanf("%s"، s);

عملکرد می گیرد()کاراکترها را می خواند تا زمانی که به یک کاراکتر پرش برسد خط جدید. این تابع همه نویسه‌ها را می‌پذیرد، اما شامل کاراکتر خط جدید نمی‌شود. یک صفر پایانی ('\0') به انتهای رشته اضافه می شود. عملکرد می گیرد()دنباله ای از کاراکترهای خوانده شده از صفحه کلید را در یک پارامتر رشته قرار می دهد و یک اشاره گر به آن رشته (در صورت موفقیت آمیز بودن عملیات)، یا NULL (در صورت بروز خطا) برمی گرداند. در مثال زیر، پس از اتمام موفقیت آمیز عملیات، دو خطوط یکسان:

#عبارتند از int main() (char s; char *p; p=gets(s)؛ printf(" \n رشته %s وارد شد. ",s); if (p) printf(" \n رشته %s وارد شد. ", p)؛ بازگشت 0؛)

به طور گذرا، توجه می کنیم که تابع gets اغلب برای وارد کردن هر داده از صفحه کلید به عنوان یک رشته به منظور تبدیل بیشتر توسط تابع sscanf به فرمت مورد نظریا برای تجزیه و تحلیل اولیه داده های ورودی، به عنوان مثال:

#عبارتند از #عبارتند از #عبارتند از int main() (char s; int x, err; do ( printf(" \n یک عدد صحیح وارد کنید -> ")؛ gets(s)؛ err=sscanf(s، "%d"،&x); if (err !=1) printf(" \n خطای ورودی. "); ) while (err!=1)؛ printf("\n عدد صحیح وارد شده -> %d"، x)؛ برگردان 0؛ )

چاپ رشته ها به خروجی استاندارد (صفحه نمایش)

برای خروجی خطوط به دستگاه استانداردخروجی (صفحه نمایش) دو عملکرد قابل استفاده است printfو قرار می دهد. در تابع printf، "%s" به عنوان فرمت ارسال می شود. راحتی استفاده از این تابع در این واقعیت نهفته است که علاوه بر رشته، می توانید بلافاصله داده های انواع دیگر را نمایش دهید. ویژگی ویژگی قرار می دهددر این واقعیت نهفته است که پس از خروجی خط، انتقال به خط بعدی.

توابع رشته

برای تبدیل رشته ها در زبان C، کتابخانه رشته ارائه شده است. هر یک از توابع فرمت ضبط خاص خود را دارد (نمونه اولیه).

توابع پرکاربرد در این مقاله مورد بحث قرار گرفته اند. - خواندن

نمونه ای از برنامه ها (فهرست) که با رشته ها کار می کنند

برنامه نویس می گوید:

سلام! من مقاله شما را خوانده ام. خیلی غمگین و در عین حال خنده دار بودم. این عبارت شما مخصوصاً باعث مرگ می شود: "از آنجایی که یک متغیر از نوع char اغلب به عنوان یک آرایه استفاده می شود، تعداد مقادیر ممکن مشخص می شود." 😆 😆 😆
من به تو نمی خندم ساخت یک وب سایت واقعا یک شاهکار است. من فقط می خواهم با مشاوره از شما حمایت کنم و به چند اشتباه اشاره کنم.

1. مقدار یک متغیر از نوع char به صورت زیر اختصاص داده می شود:

اینجا:

چارا = *"A";

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

2. صفر کردن به این صورت اتفاق می افتد:

Chara = NULL;
char b = ();

//و به این ترتیب خط در بدنه برنامه پاک می شود

"" -- این کاراکتر پایان دهنده تهی نامیده می شود. در انتهای خط قرار می گیرد. خود شما بدون اینکه بدانید آرایه s1 از مقاله خود را با این علامت پر کرده اید. اما امکان اختصاص این نماد فقط به عنصر صفر آرایه وجود داشت.

3. با خیال راحت از اصطلاحات استفاده کنید.
علامت = یک عملگر انتساب است.
علامت * عملیات عدم آدرس دهی است.
منظورم این قسمت از مقاله است: "همه چیز خیلی ساده بود، قبل از علامت = لازم بود علامت * قرار داده شود و باید عدد عنصر را اعلام کنیم (صفر مربوط به اول است)"

من را اشتباه متوجه نشوید، مقاله به شکل فعلی نمی تواند وجود داشته باشد. با خیال راحت آن را بازنویسی کنید.
شما مسئولیت بزرگی دارید! جدی میگم صفحات سایت شما وارد صفحه اول صدور Yandex شدند. بسیاری از افراد قبلاً شروع به تکرار اشتباهات شما کرده اند.

موفق باشید! شما می توانید آن را انجام دهید!

:
من مدت زیادی است که این را می دانم، فقط خواندن مجدد 200 مقاله همیشه برای رفع مشکل دشوار است. و برخی از انواع بی ادب به گونه ای می نویسند که حتی دانستن اینکه چه چیزی بهتر است اصلاح شود، اصلاً شکار نیست.

من خوشحال خواهم شد که سایر خطاها را اصلاح کنم. عدم دقت را در صورت ظاهر شدن تصحیح کنید. من از کمک شما قدردانی می کنم. متشکرم. من مدت زیادی است که این را می دانم، فقط خواندن مجدد 200 مقاله همیشه برای رفع مشکل دشوار است. و برخی از انواع بی ادب به گونه ای می نویسند که حتی دانستن اینکه چه چیزی بهتر است اصلاح شود، اصلاً شکار نیست.
با کاراکتر شما b = (); تنظیم مجدد کامل نیست. حداقل بررسی می کرد
اگر در مورد کاراکتر تهی صحبت کنیم "" ; وقتی خط را با آن پر کردم به خوبی می دانستم و هدف این بود که پاکسازی واقعی را نشان دهم و با چشم قابل مشاهده نباشد، زیرا زباله وارد خط می شود که گاهی اوقات مانع ایجاد می شود. شما باید در مورد عبارات خود دقت بیشتری داشته باشید، "نماد پایان تهی" یا فقط "نماد تهی"، نه پایان دهنده))) و نماد پایان دهنده به نظر جالب می رسد.

من مقاله را مدرن می کنم، اما به سبک شخص دیگری نمی روم. اگر فکر کنم یک مبتدی اینطوری بهتر میفهمد و نه آنطور که شما میخواهید، آن را همینطور میگذارم. شما هم من را درست درک می کنید. درک و به خاطر سپردن کلمه "نشانه" برای یک مبتدی ضعیف بسیار ساده تر از تعریف و نام هر علامت است. مطلقاً هیچ اشتباهی در این وجود ندارد، این یک نشانه است - یک نشانه. تأکید کمتر بر یکی، تأکید بیشتری بر دیگری دارد.

من خوشحال خواهم شد که سایر خطاها را اصلاح کنم. عدم دقت را در صورت ظاهر شدن تصحیح کنید. من از کمک شما قدردانی می کنم. با تشکر.

دوباره سلام!
من می خواهم توضیح دهم. معلم من در دانشگاه از اصطلاح "زرو ترمیناتور" (ترمیناتور از محدود کننده انگلیسی) استفاده کرد. انگار مدرسه قدیمی است!
در مورد سطرهای خالی کردن.
char b = (); این واقعا یک تنظیم مجدد است. کل آرایه با صفر پر شده است. باور نکنید - آن را بررسی کنید!
اگر یک رشته را به معنای طبیعی و روزمره آن در نظر بگیریم، «خالی» رشته‌ای خواهد بود که یک کاراکتر در آن وجود ندارد. بنابراین، در 99.9 درصد موارد، کافی است یک کاراکتر نول در ابتدا قرار دهید. معمولاً پردازش یک رشته تا اولین کاراکتر پوچ بالا می رود و اینکه چه کاراکترهایی بعد از آن می آیند دیگر مهم نیست. من متوجه شدم که شما می خواهید خط را تنظیم مجدد کنید. من فقط تصمیم گرفتم یک نسخه کلاسیک تست شده را ارائه دهم.

:
وقتی "معمولاً پردازش رشته به اولین کاراکتر پوچ می رود و کاراکترهایی که از آن پیروی می کنند دیگر مهم نیست" - بله، رشته به صفر بازنشانی می شود.
اگر "صفر واقعی تمام سلول های خط (که در مورد آن نوشتم)" را در نظر بگیریم - نه، صفر نمی شود، و حتی کاراکتر اول صفر نیست. من این گزینه رو تست کردم MinGW (CodeBlock) - کل آرایه کاراکتر "a" را برمی گرداند.
من فکر نمی کنم این موضوع بحث برانگیز باشد.

در این درس، رشته های سبک C را مورد بحث قرار می دهیم، ممکن است قبلاً این رشته ها را در وب سایت ما یا در هر کتاب درسی دیگری دیده باشید. در واقع، رشته‌های c فقط آرایه‌هایی از کاراکترها هستند، اما با ویژگی‌های خاص خود، بنابراین ما همیشه می‌دانیم انتهای رشته کجاست. در این مقاله، ما به چندین تابع برای کار با رشته ها نگاه خواهیم کرد، به عنوان مثال، شما - کپی، الحاق، دریافت طول یک رشته.

رشته ها چیست؟

توجه داشته باشید که در کنار رشته‌های سبک C، که اساساً آرایه‌های ساده‌ای هستند، لفظ‌های رشته‌ای نیز وجود دارند، مانند این "literal". در واقع، هر دو رشته و لفظ فقط مجموعه ای از کاراکترها هستند که در کنار هم در حافظه کامپیوتر قرار دارند. اما هنوز بین آرایه ها و لفظ ها تفاوت وجود دارد، لفظ ها قابل تغییر نیستند و رشته ها می توانند.

هر تابعی که یک رشته به سبک C می گیرد، می تواند یک پارامتر تحت اللفظی نیز داشته باشد. همچنین برخی از موجودات در C وجود دارند که ممکن است مانند رشته به نظر برسند، اگرچه در واقع اینطور نیستند. من در حال حاضر در مورد نمادها صحبت می کنم، آنها محصور شده اند نقل قول های تک، در اینجا یک مثال است - "a"، همانطور که می بینید، این یک رشته نیست. یک کاراکتر را می توان در یک مکان معین به یک رشته اختصاص داد، اما کاراکترها را نمی توان به عنوان یک رشته پردازش کرد. اگر به خاطر داشته باشید، آرایه ها مانند اشاره گر عمل می کنند، بنابراین اگر یک کاراکتر را به یک رشته ارسال کنید، خطا در نظر گرفته می شود.

با توجه به موارد فوق، باید درک می کردید که رشته ها آرایه هایی از کاراکترها هستند و رشته های لغوی کلماتی هستند که با آنها احاطه شده اند. نقل قول های دوگانه. در اینجا مثال دیگری از یک لفظ است:

"این یک رشته ثابت است"

آیا ویژگی های تار را که کمی در بالا ذکر شد فراموش کرده اید؟ بنابراین، رشته های C همیشه باید با یک کاراکتر پوچ، به معنای واقعی کلمه - "\0" پایان یابد. بنابراین، برای اعلام یک رشته متشکل از 49 حرف، لازم است یک سلول اضافی برای کاراکتر null رزرو کنید:

Char myString;

همانطور که از مثال می بینید، طول آرایه 50 کاراکتر است که 49 کاراکتر آن یک رشته و یکی، آخرین کاراکتر یک کاراکتر پوچ می گیرد. مهم است که به یاد داشته باشید که همیشه باید یک کاراکتر تهی در انتهای رشته های C وجود داشته باشد، همانطور که در انتهای هر جمله یک نقطه وجود دارد. اگرچه کاراکتر null هنگام خروجی یک رشته نمایش داده نمی شود، اما همچنان فضای حافظه را اشغال می کند. بنابراین، از نظر فنی، در یک آرایه از پنجاه عنصر، شما فقط می توانید 49 حرف را ذخیره کنید، زیرا آخرین کاراکتر برای پایان دادن به رشته مورد نیاز است. علاوه بر این، اشاره گرها همچنین می توانند به عنوان یک رشته استفاده شوند. اگر مقاله ای را در مورد می خوانید، می توانید کاری شبیه به این انجام دهید:

Char *myString; // اشاره گر از نوع char myString = malloc(sizeof(*myString) * 64); // تخصیص حافظه

در این مثال، ما 64 مکان در حافظه برای آرایه myString اختصاص داده ایم. برای آزاد کردن حافظه از تابع free() استفاده کنید.

رایگان (myString)؛

با استفاده از رشته ها

رشته ها زمانی مفید هستند که شما نیاز به انجام عملیات مختلف روی اطلاعات متنی دارید. به عنوان مثال، اگر می خواهید کاربر نامی را در برنامه وارد کند، از یک رشته استفاده می کنید. استفاده از تابع scanf() برای وارد کردن یک رشته کار می کند، اما می تواند منجر به سرریز بافر شود. به هر حال، رشته ورودی ممکن است بزرگتر از اندازه رشته بافر باشد. راه های مختلفی برای حل این مشکل وجود دارد، اما ساده ترین راه استفاده از آن است که در اعلام شده است فایل هدر .

وقتی ورودی کاربر را می‌خواند، همه کاراکترها به جز آخرین کاراکتر را می‌خواند. پس از آن، یک پایان دهنده تهی در انتهای خط خواندن قرار می گیرد. تابع fgets () کاراکترها را می خواند تا زمانی که کاربر Enter را فشار دهد. بیایید یک مثال با استفاده از fgets () ببینیم:

#عبارتند از int main() ( char myString; // long string printf("رشته طولانی را وارد کنید:"); fgets(myString, 100, stdin); // خواندن رشته از جریان ورودی printf("رشته زیر را وارد کردید: %s" ، myString)؛ getchar();)

پارامتر اول fgets() یک رشته، پارامتر دوم طول رشته و سومین پارامتر یک اشاره گر به جریان ورودی است.

نتیجه برنامه:

<ВВОД>...

همانطور که می بینید، از خروجی برنامه، یک کاراکتر خط جدید - "\n" وارد رشته ورودی شد. این به این دلیل اتفاق افتاد که ()fgets فشار دادن دکمه Enter را در رشته myString در نظر گرفت و از آن خارج شد. این بدان معنی است که ممکن است لازم باشد کاراکتر خط جدید را به صورت دستی حذف کنید. یکی از راه‌های انجام این کار، تکرار کاراکتر است. بیایید برنامه را تغییر دهیم و کاراکتر خط جدید را حذف کنیم:

#عبارتند از int main() ( char myString; // long string printf("رشته طولانی را وارد کنید:"); fgets(myString, 100, stdin); // خواندن رشته از جریان ورودی int i; برای (i = 0; i< 100; i++) { if (myString[i] == "\n") { myString[i] = "\0"; break; } } printf("Вы ввели следующую строку: %s", myString); getchar(); }

توجه داشته باشید که اگر رشته ورودی کمتر از 100 کاراکتر داشته باشد، کاراکتر خط جدید نیز در رشته گنجانده می شود. بنابراین، می توانیم این کاراکتر را با استفاده از شمارش ساده حذف کنیم. ما یک حلقه به برنامه اضافه کردیم که در آن روی کاراکترهای رشته تکرار می کنیم. خطوط 12-19. و هنگامی که با یک کاراکتر خط جدید روبرو می شویم، آن را با یک کاراکتر پوچ جایگزین می کنیم. خط 16. نتیجه برنامه:

یک خط طولانی را وارد کنید: سرنوشت اثر خود را می گذارد شما رشته زیر را وارد کرده اید: سرنوشت اثر خود را می گذارد برای بستن این پنجره کلیک کنید<ВВОД>...

فعلاً همین است. در مقاله بعدی در مورد توابع ویژه کار با رشته ها به شما خواهم گفت.

P.S.: همه ما عاشق تماشای فیلم های ضبط شده مختلف هستیم، اما گاهی اوقات پیش می آید که همیشه امکان پخش برخی از فرمت های فایل های ویدئویی وجود ندارد. بنابراین، می توانید این مشکل را با کمک برنامه - xilisoft converter ultimate حل کنید. شما به راحتی می توانید ویدئو را از یک فرمت به فرمت دیگر به سرعت تبدیل کنید. علاوه بر این، این برنامه می تواند فایل های صوتی و تصاویر متحرک را نیز تبدیل کند.

34

--- راهنمای سی شارپ --- رشته های

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

ردیف سازی

ساده ترین راه برای ساخت یک رشته کاراکتر استفاده از یک رشته واقعی است. به عنوان مثال، در خط کد زیر، به متغیر مرجع رشته str یک مرجع به یک رشته literal اختصاص داده شده است:

String str = "مثال رشته";

AT این موردمتغیر str با دنباله کاراکتر "رشته مثال" مقداردهی اولیه می شود. یک شی از نوع رشته نیز می تواند از آرایه ای از نوع char ایجاد شود. مثلا:

Char chararray = ("e"، "x"، "a"، "m"، "p"، "l"، "e"); string str = رشته جدید (chararray);

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

ماندگاری رشته

به اندازه کافی عجیب، محتویات یک شی از نوع رشته را نمی توان تغییر داد. این بدان معنی است که وقتی یک دنباله کاراکتر ایجاد شد، نمی توان آن را تغییر داد. اما این محدودیت به اجرای کارآمدتر رشته کاراکترها کمک می کند. بنابراین، این، در نگاه اول، یک نقطه ضعف آشکار در واقع به یک مزیت تبدیل می شود. بنابراین، اگر به یک رشته به عنوان تغییر رشته موجود نیاز دارید، برای این منظور باید یک رشته جدید حاوی تمام تغییرات لازم ایجاد کنید. و از آنجایی که اشیاء رشته های استفاده نشده به طور خودکار در "زباله" جمع آوری می شوند، پس حتی لازم نیست نگران سرنوشت رشته های غیر ضروری باشید.

با این حال، باید تأکید کرد که متغیرهای مرجع رشته (یعنی اشیاء از نوع رشته) در معرض تغییر هستند و بنابراین می توانند به شی دیگری ارجاع دهند. اما محتوای خود رشته رشته پس از ایجاد تغییر نمی کند.

به یک مثال توجه کنید:

استاتیک void addNewString() (string s = "This is my stroke"; s = "This is new stroke";)

بیایید برنامه را کامپایل کنیم و اسمبلی حاصل را در ابزار ildasm.exe بارگذاری کنیم. شکل کد CIL را نشان می دهد که برای متد void addNewString() تولید می شود:

به تماس های متعدد با کد opcode ldstr (بار رشته) توجه کنید. این کد آپشن ldstr در CIL شامل بارگذاری یک کد جدید است شی رشتهبه یک پشته مدیریت شده در نتیجه، شی قبلی که حاوی مقدار "This is my stroke" بود، در نهایت زباله جمع‌آوری می‌شود.

کار با رشته ها

در کلاس System.stringمجموعه ای از روش ها برای تعیین طول داده های کاراکتر، جستجو برای زیر رشته در ارائه شده است خط فعلی، تبدیل کاراکترها از حروف بزرگ به کوچک و بالعکس و غیره. در ادامه این کلاس را با جزئیات بیشتری بررسی خواهیم کرد.

فیلد، نمایه ساز و ویژگی کلاس String

کلاس String یک فیلد واحد تعریف شده دارد:

رشته فقط خواندنی استاتیک عمومی Empty;

فیلد Empty یک رشته خالی را نشان می دهد، یعنی. رشته ای که شامل کاراکتر نیست. این با یک مرجع خالی از نوع String که به سادگی به یک شی غیر موجود ساخته می شود متفاوت است.

علاوه بر این، کلاس String یک نمایه ساز تنها خواندنی را تعریف می کند:

این کاراکتر عمومی (دریافت؛)

این نمایه ساز به شما این امکان را می دهد که کاراکتر را در ایندکس مشخص شده بدست آورید. فهرست بندی رشته ها مانند آرایه ها از صفر شروع می شود. اشیاء رشته ای پایدار هستند و تغییر نمی کنند، بنابراین منطقی است که کلاس String از یک فهرست کننده فقط خواندنی پشتیبانی کند.

در نهایت، کلاس String یک ویژگی تنها خواندنی را تعریف می کند:

طول int عمومی ( دریافت؛ )

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

استفاده از سیستم؛ مثال کلاس ( static void Main() (string str = " رشته ساده"; // طول رشته و کاراکتر ششم در رشته را با استفاده از نمایه ساز Console.WriteLine("طول رشته (0) است، کاراکتر ششم "(1)" است، str.Length، خ)))

اپراتورهای کلاس رشته

کلاس String دو عملگر زیر را بارگذاری می کند: == و !=. عملگر == برای آزمایش دو رشته کاراکتر برای برابری استفاده می شود. هنگامی که عملگر == به ارجاعات شیء اعمال می شود، معمولاً بررسی می کند که آیا هر دو مرجع به یک شی هستند یا خیر. و هنگامی که عملگر == به مراجع شی از نوع String اعمال می شود، محتویات خود رشته ها برای برابری مقایسه می شوند. همین امر در مورد عملگر != نیز صدق می کند. هنگامی که به ارجاعات شی از نوع String اعمال می شود، محتویات خود رشته ها برای نابرابری مقایسه می شوند. در همان زمان، عملگرهای رابطه‌ای دیگر، از جمله =، ارجاع‌ها را به اشیایی از نوع String به همان شکلی که با اشیاء انواع دیگر مقایسه می‌کنند. و برای بررسی اینکه آیا یک رشته از رشته دیگر بزرگتر است، باید متد Compare() تعریف شده در کلاس String را فراخوانی کنید.

همانطور که بعداً مشخص خواهد شد، بسیاری از انواع مقایسه رشته کاراکترها از اطلاعات فرهنگی استفاده می کنند. اما این برای عملگرهای == و != صدق نمی کند. از این گذشته ، آنها به سادگی مقادیر ترتیبی کاراکترها را در رشته ها مقایسه می کنند. (به عبارت دیگر، آنها مقادیر کاراکترهای باینری را که توسط هنجارهای فرهنگی، یعنی محلی ها اصلاح نشده اند، مقایسه می کنند).

متدهای کلاس رشته

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

روش های رشته ای
روش ساختار و نسخه های اضافه بار هدف
مقایسه رشته ها
مقایسه () عمومی static int مقایسه (strA stA, string strB)

مقایسه عمومی ایستا (strA strA، string strB، bool ignoreCase)

مقایسه ایستا عمومی (strA strA، string strB، StringComparison Type Compare)

مقایسه ایستا عمومی (strA strA، string strB، bool ignoreCase، CultureInfo Culture)

روش استاتیک، رشته strA را با رشته strB مقایسه می کند. اگر رشته strA مقدار مثبتی را برمی‌گرداند خط بیشتر strB; اگر strA کمتر از strB باشد منفی است. و اگر رشته های strA و strB برابر باشند، صفر می شود. مقایسه به حروف بزرگ و از نظر فرهنگی حساس است.

اگر پارامتر ignoreCase روی مقدار بولی true تنظیم شود، مقایسه تفاوت بین حروف بزرگ و کوچک را در نظر نمی گیرد. در غیر این صورت این تفاوت ها در نظر گرفته می شود.

پارامتر ComparationType مشخص می کند راه خاصمقایسه رشته ها کلاس CultureInfo در فضای نام System.Globalization تعریف شده است.

عمومی static int مقایسه (strA strA, int indexA, string strB, int indexB, int length)

int استاتیک عمومی مقایسه (strA strA، int indexA، string strB، int indexB، int length، bool ignoreCase)

مقایسه بین استاتیک عمومی (strA strA، int indexA، string strB، int indexB، int length، StringComparison Type)

مقایسه عمومی static int (strA string, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo Culture)

بخش هایی از رشته های strA و strB را با هم مقایسه می کند. مقایسه با عناصر رشته strA و strB شروع می شود و شامل تعداد کاراکترهای مشخص شده توسط پارامتر طول می شود. اگر بخشی از strA بزرگتر از بخشی از strB باشد، روش یک مقدار مثبت برمی گرداند. یک مقدار منفی اگر بخشی از strA کمتر از بخشی از strB باشد. و اگر قسمت های مقایسه شده رشته های strA و strB برابر باشند، صفر می شود. مقایسه به حروف بزرگ و از نظر فرهنگی حساس است.

CompareOrdinal() عمومی static int CompareOrdinal(strA stA, string strB)

عمومی static int CompareOrdinal(strA strA، int indexA، string strB، int indexB، int count)

همانند متد Compare() را انجام می دهد، اما بدون توجه به تنظیمات محلی

در مقایسه با() عمومی int CompareTo (مقدار شی)

رشته فراخوان را با نمایش رشته ای شی مقدار مقایسه می کند. اگر رشته فراخوان بزرگتر از مقدار رشته باشد، مقدار مثبتی را برمی‌گرداند. یک مقدار منفی اگر رشته فراخوان کمتر از رشته مقدار باشد. و اگر رشته های مقایسه شده برابر باشند صفر می شود

عمومی int CompareTo (strB string)

رشته فراخوان را با strB مقایسه می کند

برابر () نادیده گرفتن عمومی bool برابر است (object obj)

اگر رشته فراخوان دارای همان دنباله کاراکترهایی باشد که نمایش رشته obj دارد، مقدار بولی را true برمی گرداند. مقایسه ترتیبی، حساس به حروف کوچک، اما از نظر فرهنگی غیر حساس انجام می دهد

bool عمومی برابر است (مقدار رشته)

بوول عمومی برابر است (مقدار رشته، نوع مقایسه مقایسه رشته)

اگر رشته فراخوان دارای همان دنباله کاراکترهای مقدار رشته باشد، مقدار بولی را درست برمی‌گرداند. مقایسه ترتیبی انجام می شود، حساس به حروف کوچک، اما از نظر فرهنگی غیر حساس. پارامتر ComparationType روش خاصی را برای مقایسه رشته ها تعریف می کند

بوول استاتیک عمومی برابر است (رشته a، رشته b)

بوول ثابت عمومی برابر است (رشته a، رشته b، نوع مقایسه مقایسه رشته)

اگر رشته a دارای دنباله ای از کاراکترهای مشابه رشته b باشد، درست بولی را برمی گرداند. مقایسه ترتیبی انجام می شود، حساس به حروف کوچک، اما از نظر فرهنگی غیر حساس. پارامتر ComparationType روش خاصی را برای مقایسه رشته ها تعریف می کند

الحاق (اتصال) رشته ها
Concat() رشته استاتیک عمومی Concat (رشته str0، رشته str1);

رشته ایستا عمومی Concat (مقادیر رشته را پارامترها)؛

نمونه های رشته های جداگانه را در یک رشته واحد ترکیب می کند (الحاق)
جستجو در یک رشته
حاوی () عمومی bool حاوی (مقدار رشته) روشی که به شما امکان می دهد تعیین کنید آیا یک رشته دارای یک زیررشته خاص (مقدار) است یا خیر.
شروع می شود با() bool عمومی StartsWith (مقدار رشته)

bool عمومی StartsWith (مقدار رشته، نوع مقایسه مقایسه رشته)

اگر رشته فراخوانی با زیررشته مقدار شروع شود، مقدار بولی را true برمی گرداند. در غیر این صورت، مقدار بولی false برگردانده می شود. پارامتر ComparationType نحوه انجام جستجو را مشخص می کند.

به پایان می رسد با() bool عمومی EndsWith (مقدار رشته)

bool عمومی EndsWith (مقدار رشته، StringComparison Type مقایسه)

اگر رشته فراخوانی به رشته فرعی مقدار ختم شود، مقدار بولی را true برمی گرداند. در غیر این صورت، مقدار بولی false را برمی گرداند. پارامتر ComparationType یک روش جستجوی خاص را تعریف می کند

IndexOf() عمومی int IndexOf (مقدار کاراکتر)

عمومی int IndexOf (مقدار رشته)

اولین رخداد یک زیررشته یا کاراکتر معین را در یک رشته پیدا می کند. اگر کاراکتر یا زیررشته مورد نظر شما پیدا نشد، -1 برگردانده می شود.

عمومی int IndexOf (مقدار کاراکتر، int startIndex)

عمومی int IndexOf (مقدار رشته، int startIndex)

عمومی int IndexOf (مقدار کاراکتر، int startIndex، int count)

int عمومی IndexOf (مقدار رشته، int startIndex، int count)

شاخص اولین وقوع کاراکتر یا مقدار رشته فرعی را در رشته فراخوان برمی‌گرداند. جستجو از عنصر مشخص شده در index startIndex شروع می شود و تعداد عناصر مشخص شده توسط پارامتر count (در صورت مشخص شدن) را در بر می گیرد. اگر کاراکتر یا زیررشته جستجو شده یافت نشد، متد -1 را برمی گرداند

LastIndexOf() نسخه های بارگذاری شده مشابه متد IndexOf() هستند

مانند IndexOf، اما آخرین رخداد یک کاراکتر یا زیررشته را به جای اولین پیدا می کند.

IndexOfAny() عمومی int IndexOfAny(char anyOf)

عمومی int IndexOfAny (char anyOf، int startIndex)

عمومی int IndexOfAny(char anyOf، int startIndex، int count)

شاخص اولین وقوع هر کاراکتری در آرایه anyOf موجود در رشته فراخوان را برمی‌گرداند. جستجو از عنصر مشخص شده توسط index startIndex شروع می شود و تعداد عناصر مشخص شده توسط پارامتر count (در صورت وجود) را در بر می گیرد. اگر هیچ تطابقی برای هیچ یک از کاراکترهای آرایه anyOf یافت نشود، متد -1 را برمی گرداند. جستجو به روش معمولی انجام می شود

LastIndexOfAny نسخه های بارگذاری شده مشابه متد IndexOfAny() هستند

شاخص آخرین وقوع هر کاراکتری در آرایه anyOf موجود در رشته فراخوان را برمی‌گرداند.

شکافتن و به هم پیوستن رشته ها
شکاف تقسیم رشته عمومی (پارامز جداکننده کاراکترها)

تقسیم رشته عمومی (پارامز جداکننده کاراکترها، تعداد int)

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

اولین شکل متد Split() رشته فراخوان را به اجزای سازنده آن تقسیم می کند. نتیجه آرایه ای است که شامل زیررشته های بازیابی شده از رشته فراخوان می شود. کاراکترهایی که این زیررشته ها را مشخص می کنند در آرایه جداکننده ارسال می شوند. اگر آرایه جداکننده خالی باشد یا به یک رشته خالی اشاره دارد، از یک فاصله به عنوان جداکننده زیر رشته استفاده می شود. و در شکل دوم این روش تعداد زیر رشته های تعیین شده توسط پارامتر count برگردانده می شود.

تقسیم رشته عمومی (پارامز جداکننده کاراکترها، گزینه های StringSplitOptions)

تقسیم رشته عمومی (جداکننده رشته، گزینه های StringSplitOptions)

تقسیم رشته عمومی (جداکننده کاراکترها، تعداد int، گزینه های StringSplitOptions)

تقسیم رشته عمومی (جداکننده رشته، تعداد int، گزینه های StringSplitOptions)

دو شکل اول متد Split() رشته فراخوان را به قطعات تقسیم می کند و آرایه ای حاوی زیررشته های به دست آمده از رشته فراخوان را برمی گرداند. کاراکترهایی که این زیررشته ها را جدا می کنند در آرایه جداکننده ارسال می شوند. اگر آرایه جداکننده خالی باشد، از یک فاصله به عنوان جداکننده استفاده می شود. و در فرم های سوم و چهارم این متد، تعداد سطرها با پارامتر count محدود می شود.

اما در همه اشکال، پارامتر گزینه روش خاصی را برای مدیریت رشته های خالی مشخص می کند، که زمانی که دو جداکننده مجاور هم هستند تولید می شوند. شمارش StringSplitOptions تنها دو مقدار را تعریف می کند: هیچ یکو RemoveEmptyEntries. اگر پارامتر گزینه None باشد، پس خطوط خالیدر نتیجه نهایی تقسیم رشته اصلی گنجانده شده است. و اگر پارامتر options روی RemoveEmptyEntries تنظیم شود، رشته های خالی از نتیجه نهایی تقسیم رشته اصلی حذف می شوند.

پیوستن() پیوستن به رشته استاتیک عمومی (جداکننده رشته، مقدار رشته)

رشته استاتیک عمومی Join (جداکننده رشته، مقدار رشته، int startIndex، تعداد int)

یک رشته جدید با ترکیب محتویات یک آرایه از رشته ها می سازد.

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

خطوط پر کردن و پیرایش
trim() رشته عمومی Trim()

Trim رشته عمومی (params char trimChars)

روشی که به شما این امکان را می‌دهد تا تمام رخدادهای یک مجموعه مشخص از کاراکترها را از ابتدا و انتهای رشته فعلی حذف کنید.

اولین شکل متد Trim() فضاهای اصلی و انتهایی را از رشته فراخوان حذف می کند. و شکل دوم این روش، رخدادهای پیشرو و انتهایی در رشته فراخوانی کاراکترها را از آرایه trimChars حذف می کند. هر دو شکل رشته حاصل را برمی گردانند.

PadLeft() رشته عمومی PadLeft (int totalWidth)

رشته عمومی PadLeft (int totalWidth، char paddingChar)

به شما امکان می دهد رشته را با کاراکترهای سمت چپ قرار دهید.

شکل اول متد PadLeft() فضاهایی را در سمت چپ رشته فراخوانی وارد می کند تا طول کل آن با مقدار پارامتر totalWidth برابر شود. در شکل دوم این روش، کاراکترهایی که با پارامتر paddingChar مشخص می شوند در سمت چپ رشته فراخوانی وارد می شوند تا طول کل آن برابر با مقدار پارامتر totalWidth شود. هر دو شکل رشته حاصل را برمی گردانند. اگر مقدار پارامتر totalWidth کمتر از طول رشته فراخوانی باشد، یک کپی از رشته فراخوانی اصلاح نشده برگردانده می شود.

PadRight() مشابه PadLeft()

به شما امکان می دهد رشته را با کاراکترهای سمت راست قرار دهید.

درج، حذف و جایگزینی ردیف ها
درج () رشته عمومی درج (Int startIndex، مقدار رشته)

برای درج یک رشته در رشته دیگر استفاده می شود، جایی که مقدار رشته ای است که باید در رشته فراخوان در فهرست startIndex درج شود. متد رشته حاصل را برمی گرداند.

برداشتن() رشته عمومی حذف (int startIndex)

رشته عمومی حذف (Int startIndex، int count)

برای حذف بخشی از یک رشته استفاده می شود. در شکل اول متد Remove() حذف از محل مشخص شده توسط index startIndex شروع می شود و تا انتهای رشته ادامه می یابد. و در شکل دوم این روش، تعداد کاراکترهای مشخص شده توسط پارامتر count از محل مشخص شده توسط شاخص startIndex از رشته حذف می شود.

جایگزین کردن() رشته عمومی جایگزین (char oldChar، char newChar)

رشته عمومی جایگزین (رشته oldValue، رشته newValue)

برای جایگزینی بخشی از یک رشته استفاده می شود. اولین شکل متد Replace() تمام رخدادهای oldChar در رشته فراخوان را با newChar جایگزین می کند. و در شکل دوم این روش، تمام رخدادهای رشته oldValue در رشته فراخوان با رشته newValue جایگزین می شود.

تغییر پرونده
ToUpper() رشته عمومی ToUpper()

تمام حروف در رشته فراخوان را بزرگ می کند.

برای کاهش() رشته عمومی ToLower()

تمام حروف در رشته فراخوان را با حروف کوچک می کند.

گرفتن زیر رشته از یک رشته
زیر رشته () رشته عمومی زیر رشته (int startIndex)

رشته عمومی زیر رشته (int startIndex، int length)

در شکل اول متد ()Substring، رشته فرعی از محل مشخص شده توسط پارامتر startIndex تا انتهای رشته فراخوان استخراج می شود. و در شکل دوم این روش، یک رشته فرعی مشتمل بر تعداد کاراکترهای مشخص شده توسط پارامتر طول، از جایی که با پارامتر startIndex مشخص شده است، استخراج می شود.

مثال برنامه زیر از چندین روش فوق استفاده می کند:

استفاده از سیستم؛ با استفاده از System.Collections.Generic. با استفاده از System.Linq؛ با استفاده از System.Text. namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // مقایسه دو رشته اول string s1 = "This is a string"; string s2 = "This is text, this is a string"; if (String.CompareOrdinal (s1, s2) != 0) Console.WriteLine("رشته های s1 و s2 برابر نیستند")؛ if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine( "با این حال، آنها حاوی یک متن هستند")؛ // الحاق رشته ها Console.WriteLine(String.Concat("\n" + "One, two "," three, four")); // جستجو در رشته // اولین اتفاق از رشته فرعی if (s2. IndexOf("this") != -1) Console.WriteLine("کلمه \"this\" در خط پیدا شد، "+ "at: (0) position" است، s2. IndexOf("this")); / / آخرین وقوع زیررشته if (s2.LastIndexOf("this") != -1) Console.WriteLine("آخرین رخداد \"this\" " + "در ( 0) position", s2.LastIndexOf("this"))؛ // جستجو از آرایه کاراکترها char myCh = ("S","x","t")؛ if (s2.IndexOfAny(myCh) != -1) Console.WriteLine("یکی از کاراکترهای آرایه ch "+" موجود در جریان فعلی خط فعلی در موقعیت (0)", s2.IndexOfAny(myCh)); // تعیین کنید که آیا رشته با زیررشته داده شده شروع می شود if (s2.StartsWith("this is text") == true) Console.WriteLine("Substring found!"); // با استفاده از مثال تعیین رشته سیستم عامل کاربر myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Your سیستم عامل Windows XP")؛ other if (myOS.Contains ("NT 6.1")) Console.WriteLine ("سیستم عامل شما سیستم ویندوز 7")؛ Console.ReadLine(); )))

کمی در مورد مقایسه رشته ها در سی شارپ

از بین تمام عملیات پردازش رشته کاراکترها، این احتمالاً بیشترین مقایسه یک رشته با رشته دیگر است. قبل از بررسی هر روش مقایسه رشته ها، باید بر موارد زیر تأکید کرد: مقایسه رشته ها را می توان در دات نت فریم ورک به دو روش اصلی انجام داد:

    اول، مقایسه ممکن است منعکس کننده آداب و رسوم و هنجارهای یک محیط فرهنگی خاص باشد، که اغلب تنظیمات فرهنگی هستند که هنگام اجرای یک برنامه تأثیر می گذارند. این رفتار استاندارد برای برخی از روش‌های مقایسه است، البته نه همه.

    و ثانیاً، مقایسه را می توان بدون توجه به تنظیمات محیط فرهنگی، فقط بر روی مقادیر ترتیبی کاراکترهایی که رشته را تشکیل می دهند، انجام داد. به طور کلی، مقایسه فرهنگی بی‌حساس رشته‌ها از ترتیب واژگانی (و ویژگی‌های زبانی) برای تعیین اینکه آیا یک رشته بزرگ‌تر، کوچک‌تر یا مساوی رشته دیگری است، استفاده می‌کند. در یک مقایسه ترتیبی، رشته ها به سادگی بر اساس مقدار تغییر نیافته هر کاراکتر مرتب می شوند.

با توجه به تفاوت در نحوه مقایسه رشته ها بین فرهنگ ها و مقایسه های ترتیبی و پیامدهای هر یک از این مقایسه ها، اکیداً توصیه می شود از بهترین شیوه هادر حال حاضر توسط مایکروسافت ارائه شده است. پس از همه، انتخاب روش اشتباه برای مقایسه رشته ها می تواند منجر به کار اشتباهبرنامه زمانی که در محیطی متفاوت از محیطی که در آن توسعه داده شده است اجرا شود.

انتخاب نحوه مقایسه رشته های کاراکتر یک تصمیم بسیار مهم است. به عنوان یک قاعده کلی، و بدون استثنا، اگر به منظور نمایش نتیجه به کاربر باشد (مثلاً برای نمایش مجموعه ای از رشته ها که به ترتیب واژگانی مرتب شده اند) باید یک مقایسه رشته حساس فرهنگی را انتخاب کنید. اما اگر رشته‌ها حاوی اطلاعات ثابتی هستند که برای تفاوت‌های فرهنگی تغییر داده نمی‌شوند، مانند نام فایل، کلمه کلیدی، یک آدرس وب سایت یا یک مقدار مرتبط با امنیت، سپس باید یک مقایسه رشته ترتیبی را انتخاب کنید. البته، ویژگی های برنامه خاصی که در حال توسعه است، انتخاب یک روش مناسب برای مقایسه رشته های کاراکتر را تعیین می کند.

کلاس String بیشترین امکانات را فراهم می کند روش های مختلفمقایسه رشته ای که در جدول بالا ذکر شده است. همه کاره ترین آنها متد Compare() است. این امکان را به شما می دهد که دو رشته را به طور کامل یا جزئی، به حروف بزرگ یا بزرگ و کوچک، به روشی که توسط پارامتر نوع تعیین می شود، مقایسه کنید. مقایسه رشته هاو همچنین اطلاعات فرهنگی ارائه شده توسط پارامتر نوع فرهنگ اطلاعات.

آن اضافه بارهای متد Compare() که حاوی پارامتری از نوع StringComparison نیستند، یک مقایسه حساس به حروف و فرهنگ رشته کاراکترها را انجام می دهند. و در آن دسته از انواع اضافه بار که حاوی پارامتری از نوع CultureInfo نیستند، اطلاعات فرهنگ توسط محیط زمان اجرا فعلی تعیین می شود.

نوع StringComparison یک شمارش است که مقادیر نشان داده شده در جدول زیر را مشخص می کند. با استفاده از این مقادیر، می توانید مقایسه رشته ها را مطابق با نیازهای برنامه خود سازماندهی کنید. بنابراین، افزودن یک پارامتر نوع StringComparison قابلیت‌های متد ()Compare و سایر روش‌های مقایسه مانند ()Equals را گسترش می‌دهد. همچنین این امکان را فراهم می کند که به طور واضح نحوه مقایسه رشته ها را مشخص کنید.

به دلیل تفاوت‌هایی که بین مقایسه‌های رشته‌ای حساس فرهنگی و مقایسه‌های ترتیبی وجود دارد، مهم است که تا حد امکان در این زمینه دقیق باشیم.

مقادیر تعریف شده در فهرست StringComparison
معنی شرح
فرهنگ کنونی مقایسه رشته ها با استفاده از تنظیمات فرهنگ فعلی انجام می شود
CurrentCultureIgnoreCase مقایسه رشته ها با استفاده از تنظیمات فرهنگ فعلی انجام می شود، اما به حروف بزرگ و کوچک حساس نیستند
فرهنگ ثابت مقایسه رشته ها با استفاده از غیرقابل تغییر انجام می شود، یعنی. داده های جهانی در مورد محیط فرهنگی
InvariantCultureIgnoreCase مقایسه رشته ها با استفاده از غیرقابل تغییر انجام می شود، یعنی. داده های فرهنگی جهانی و حساس به حروف کوچک و بزرگ
ترتیبی مقایسه رشته ها با استفاده از مقادیر ترتیبی کاراکترهای رشته انجام می شود. در این صورت ممکن است نظم واژگانی نقض شود و کنوانسیون هاپذیرفته شده در یک محیط فرهنگی خاص نادیده گرفته می شوند
OrdinalIgnoreCase مقایسه رشته با استفاده از مقادیر ترتیبی کاراکترهای رشته انجام می شود، اما به حروف بزرگ و کوچک حساس نیست.

در هر صورت، متد Compare() یک مقدار منفی برمی گرداند اگر اولین رشته ای که مقایسه می شود کمتر از رشته دوم باشد. یک مقدار مثبت اگر رشته اول مقایسه شده بزرگتر از رشته دوم باشد. و در نهایت صفر اگر هر دو رشته مقایسه شده برابر باشند. اگر چه متد Compare() در صورت مساوی بودن رشته های مقایسه شده صفر را برمی گرداند، به طور کلی بهتر است از متد Equals() یا عملگر == برای تعیین مساوی بودن رشته های کاراکتر استفاده کنید.

واقعیت این است که متد Compare() برابری رشته های مقایسه شده را بر اساس ترتیب مرتب سازی آنها تعیین می کند. به عنوان مثال، اگر رشته ها از نظر فرهنگی مقایسه شوند، ممکن است هر دو رشته از نظر ترتیب مرتب سازی یکسان باشند، اما اساساً برابر نباشند. به طور پیش فرض، برابری رشته در متد Equals() بر اساس مقادیر ترتیبی کاراکتر تعیین می شود و از نظر فرهنگی حساس نیست. بنابراین، به طور پیش فرض، هر دو رشته در این روش برای برابری مطلق، کاراکتر به کاراکتر، مشابه نحوه انجام آن در عملگر == مقایسه می شوند.

علیرغم تطبیق پذیری زیاد متد ()Compare، برای مقایسه ترتیبی ساده رشته کاراکترها، استفاده از متد CompareOrdinal() آسانتر است. در نهایت، به خاطر داشته باشید که متد CompareTo() فقط رشته ها را به روشی حساس از نظر فرهنگی مقایسه می کند.

برنامه زیر استفاده از متدهای Compare()، Equals()، CompareOrdinal() و عملگرهای == و != را برای مقایسه رشته های کاراکتر نشان می دهد. توجه داشته باشید که دو مثال مقایسه اول به وضوح تفاوت بین مقایسه رشته های حساس فرهنگی و مقایسه ترتیبی انگلیسی را نشان می دهد:

استفاده از سیستم؛ کلاس مثال ( static void Main( (string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int result; / / ابتدا، تفاوت بین مقایسه رشته حساس به فرهنگ و نتیجه مقایسه ترتیبی را نشان دهید = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("مقایسه رشته حساس به فرهنگ: "); if (نتیجه 0 ) کنسول .WriteLine(str1 + " بزرگتر از " + str2 است)؛ other Console.WriteLine(str1 + "is " + str2)؛ result = String.Compare(str1, str2, StringComparison.Ordinal)؛ Console.Write("مقایسه ترتیبی خطوط: ")؛ اگر (نتیجه 0) Console.WriteLine(str1 + " بزرگتر از " + str2 است)؛ در غیر این صورت Console.WriteLine(str1 + "برابر با " + str4 است)؛ // از نتیجه متد CompareOrdinal() استفاده کنید = String.CompareOrdinal(str1, str2)؛ Console.Write("مقایسه رشته ها با استفاده از CompareOrdinal():\n")؛ if (نتیجه 0) Console.WriteLine(str1 + " بزرگتر از " + str2)؛ وگرنه Console.WriteLine (خیابان 1 + "برابر است با " + str4)؛ Console.WriteLine(); // تعیین برابری رشته ها با استفاده از عملگر == // این یک مقایسه ترتیبی از رشته های کاراکتر است اگر (str1 == str4) Console.WriteLine(str1 + " == " + str4); // تشخیص نابرابری خط با استفاده از عملگر != if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // با استفاده از متد Equals() یک مقایسه رشته بدون حساسیت حروف ترتیبی انجام دهید if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("مقایسه رشته ها با استفاده از متد Equals() با پارامتر " + " OrdinalIgnoreCase: \n" + str1 + " برابر است با " + str2); Console.WriteLine(); // مقایسه بخش‌های رشته‌ها if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("مقایسه رشته‌ها بر اساس فرهنگ فعلی:" + "\n3 کاراکتر اول رشته " + str2 + " بزرگتر از 3 کاراکتر اول رشته " + str5 است)؛ ) ))

با اجرای این برنامه نتیجه زیر حاصل می شود:

لطفاً AdBlock را در این سایت متوقف کنید.

بنابراین، رشته ها در زبان C. برای آنها فراهم نشده است نوع جداگانهداده ها، همانطور که در بسیاری از زبان های برنامه نویسی دیگر انجام می شود. در زبان C، رشته آرایه ای از کاراکترها است. برای علامت گذاری انتهای یک خط از کاراکتر "\0" استفاده می شود که در قسمت آخر این درس در مورد آن صحبت کردیم. به هیچ وجه روی صفحه نمایش داده نمی شود، بنابراین نگاه کردن به آن کار نخواهد کرد.

ایجاد و مقداردهی اولیه یک رشته

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

کد زیر روش های مختلفی برای مقداردهی اولیه رشته ها را نشان می دهد.

لیست 1.

Charstr; char str1 = ("Y"، "o"، "n"، "g"، "C"، "o"، "d"، "e"، "r"، "\0"); char str2 = "سلام!"; char str3 = "سلام!";

شکل 1 اعلان و مقداردهی اولیه رشته ها

در خط اول، ما به سادگی یک آرایه از ده کاراکتر را اعلام می کنیم. این حتی در واقع یک رشته نیست، زیرا تا زمانی که فقط مجموعه ای از کاراکترها باشد، فاقد کاراکتر null \0 است.

خط دوم. ساده ترین راه برای مقداردهی اولیه در پیشانی. هر نماد را جداگانه اعلام می کنیم. نکته اصلی در اینجا این است که فراموش نکنید که کاراکتر null \0 را اضافه کنید.

خط سوم شبیه خط دوم است. به تصویر دقت کنید. زیرا در رشته سمت راست کاراکترهای کمتری نسبت به عناصر آرایه وجود دارد، بقیه عناصر با \ 0 پر می شوند.

خط چهارم. همانطور که می بینید، اندازه در اینجا تنظیم نشده است. برنامه به طور خودکار آن را محاسبه می کند و آرایه ای از کاراکترها با طول مورد نیاز ایجاد می کند. این کاراکتر null \0 را در آخر وارد می کند.

نحوه خروجی گرفتن از یک رشته

بیایید کد بالا را به یک برنامه کامل اضافه کنیم که رشته های تولید شده را روی صفحه نمایش دهد.

لیست 2.

#عبارتند از int main(void) (char str؛ char str1 = ("Y"، "o"، "n"، "g"، "C"، "o"، "d"، "e"، "r،" \0")؛ char str2 = "سلام!"؛ char str3 = "سلام!"; for(int i = 0; i< 10; i = i + 1) printf("%c\t",str[i]); printf("\n"); puts(str1); printf("%s\n",str2); puts(str3); return 0; }


شکل 2 روش های مختلف برای نمایش یک رشته بر روی صفحه نمایش

همانطور که می بینید، چندین روش اساسی برای نمایش یک رشته روی صفحه وجود دارد.

  • استفاده کنید تابع printfبا مشخص کننده %s
  • از تابع puts استفاده کنید
  • از تابع fputs استفاده کنید و به عنوان پارامتر دوم مشخص کنید جریان استانداردبرای خروجی stdout .

تنها اخطار توابع puts و fputs است. توجه داشته باشید که تابع puts خروجی را به خط بعدی میپیچد اما تابع fputs اینطور نیست.

همانطور که می بینید، خروجی بسیار ساده است.

وارد کردن رشته ها

با ورودی رشته، همه چیز کمی پیچیده تر از خروجی است. ساده ترین راه به صورت زیر خواهد بود:

لیست 3.

#عبارتند از int main(void) (char str؛ gets(str؛ puts(str؛ return 0; )

تابع gets برنامه را متوقف می کند، رشته ای از کاراکترهای وارد شده از صفحه کلید را می خواند و آن را در یک آرایه کاراکتری قرار می دهد که نام آن به عنوان پارامتر به تابع ارسال می شود.
تابع gets با کاراکتر مربوط به کلید enter خاتمه می یابد و به صورت یک کاراکتر تهی در رشته نوشته می شود.
متوجه خطر شدید؟ در غیر این صورت، کامپایلر با مهربانی به شما در مورد آن هشدار می دهد. این به این دلیل است که تابع gets تنها زمانی خارج می شود که کاربر کلید enter را فشار دهد. این مملو از این واقعیت است که در مورد ما می توانیم از آرایه فراتر برویم - اگر بیش از 20 کاراکتر وارد شده باشد.
به هر حال، خطاهای سرریز بافر قبلی رایج ترین نوع آسیب پذیری در نظر گرفته می شد. آنها هنوز هم امروزه یافت می شوند، اما استفاده از آنها برای هک برنامه ها بسیار دشوارتر شده است.

خیله خب پس ما چه چیزی داریم. ما یک وظیفه داریم: یک رشته را در یک آرایه با اندازه محدود بنویسیم. یعنی باید به نحوی تعداد کاراکترهای وارد شده توسط کاربر را کنترل کنیم. و در اینجا تابع fgets به کمک می آید:

لیست 4.

#عبارتند از int main(void) (char str؛ fgets (str, 10, stdin); puts (str؛ return 0; )

تابع fgets سه آرگومان را به عنوان ورودی می گیرد: یک متغیر برای نوشتن رشته، اندازه رشته ای که باید بنویسد، و نام جریانی که از کجا می توان داده ها را برای نوشتن در رشته دریافت کرد، در این مورد stdin. همانطور که قبلاً از درس 3 می دانید، stdin جریان ورودی استاندارد است که معمولاً با صفحه کلید مرتبط است. لازم نیست که داده ها از جریان stdin بیایند، در آینده نیز از این تابع برای خواندن داده ها از پرونده ها استفاده خواهیم کرد.

اگر در حین اجرای این برنامه، رشته ای بیش از 10 کاراکتر وارد کنیم، از ابتدا فقط 9 کاراکتر باشد و همچنان کاراکتر شکست خط در آرایه نوشته شود، fgets رشته را به طول مورد نیاز «برش» می دهد.

توجه داشته باشید که تابع fgets 10 کاراکتر را نمی خواند، بلکه 9 کاراکتر را می خواند! همانطور که به یاد داریم، در رشته ها آخرین کاراکتر برای کاراکتر null رزرو شده است.

بگذار چک کنیم. بیایید برنامه را از آخرین لیست اجرا کنیم. و رشته 1234567890 را وارد کنید. رشته 123456789 روی صفحه نمایش داده می شود.


شکل 3 نمونه ای از عملکرد تابع fgets

این سوال پیش می آید. شخصیت دهم کجا رفت؟ و من پاسخ خواهم داد. جایی نرفته است، در جریان ورودی باقی مانده است. برنامه زیر را اجرا کنید.

لیست 5.

#عبارتند از int main(void) (char str; fgets(str, 10, stdin); puts(str؛ int h = 99; printf("do %d\n"، h); scanf("%d"،&h) ; printf("پس از %d\n"، h)؛ بازگشت 0؛ )

در اینجا نتیجه کار او است.


شکل 4 بافر stdin غیر خالی

بگذارید توضیح دهم چه اتفاقی افتاده است. تابع fgets را فراخوانی کردیم. او جریان ورودی را باز کرد و منتظر ماند تا داده ها را وارد کنیم. ما 1234567890\n را از صفحه کلید وارد کردیم (\n مخفف فشار دادن کلید Enter است). این به جریان ورودی stdin رفت. تابع fgets، همانطور که انتظار می رفت، 9 کاراکتر اول 123456789 را از جریان ورودی گرفت، کاراکتر null \0 را به آنها اضافه کرد و این را در رشته str نوشت. هنوز 0\n در جریان ورودی باقی مانده است.

بعد، متغیر h را اعلام می کنیم. مقدار آن را روی صفحه نمایش می دهیم. سپس تابع scanf را فراخوانی می کنیم. در اینجا انتظار می رود که بتوانیم چیزی را وارد کنیم، اما از آنجا که 0\n در جریان ورودی قرار می‌گیرد، سپس عملکرد اسکناین را به عنوان ورودی ما می گیرد و 0 را به h می نویسد. بعد، آن را روی صفحه نمایش می دهیم.

البته این دقیقاً رفتاری نیست که ما انتظار داریم. برای مقابله با این مشکل، لازم است پس از اینکه ورودی کاربر را از روی آن خواندیم، بافر ورودی را پاک کنیم. برای این کار استفاده می شود عملکرد ویژهفلاش این فقط یک پارامتر دارد - جریانی که باید پاک شود.

بیایید مثال آخر را طوری درست کنیم که به طور قابل پیش بینی کار کند.

لیست 6.

#عبارتند از int main(void) (char str; fgets(str, 10, stdin); fflush(stdin); // جریان ورودی پاک puts(str); int h = 99; printf("do %d\n"، h) ; scanf("%d"،&h); printf("پس از %d\n"، h); بازگشت 0;)

اکنون برنامه همانطور که باید کار می کند.


شکل 4 شستشوی بافر stdin با تابع flush

به طور خلاصه، دو واقعیت قابل ذکر است. اولین. در این لحظهاستفاده از تابع gets ناامن است، بنابراین توصیه می شود از تابع fgets در همه جا استفاده کنید.

دومین. در صورت استفاده از تابع fgets فراموش نکنید که بافر ورودی را پاک کنید.

این گفتگو درباره وارد کردن رشته ها به پایان می رسد. حرکت کن.

برترین مقالات مرتبط