34

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

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

ردیف سازی

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

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

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

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

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

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

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

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

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

Static 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 یک ویژگی تنها خواندنی را تعریف می کند:

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

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

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

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

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

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

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

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

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

مقایسه عمومی ایستا (strA string، 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 بگیرد بولیدرست است، مقایسه تفاوت بین حروف بزرگ و کوچک را در نظر نمی گیرد. در غیر این صورت این تفاوت ها در نظر گرفته می شود.

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

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)

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

بخش هایی از رشته های 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 مقایسه می کند

برابر () عمومی لغو بوول برابر است (object obj)

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

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

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

اگر رشته فراخوان دارای همان دنباله کاراکترهای مقدار رشته باشد، مقدار بولی را true برمی‌گرداند. مقایسه ترتیبی انجام می شود، حساس به حروف کوچک، اما از نظر فرهنگی غیر حساس. پارامتر 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 (مقدار رشته، نوع مقایسه مقایسه رشته)

اگر رشته فراخوانی به رشته فرعی مقدار ختم شود، مقدار بولی را 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 باشد، رشته های خالی در نتیجه نهایی تقسیم قرار می گیرند. رشته اصلی. و اگر پارامتر گزینه ها روی 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()

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

درج، حذف و جایگزینی ردیف ها
Insert() رشته عمومی درج (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 ("سیستم عامل شما سیستم ویندوز XP"); other if (myOS.Contains("NT 6.1")) Console.WriteLine("Your سیستم عامل Windows 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 است)؛ ) ))

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

هیچ نوع داده جداگانه ای "رشته کاراکترها" در زبان C وجود ندارد. کار با رشته ها با استفاده از آرایه های یک بعدی از نوع char، یعنی. یک رشته کاراکتر یک آرایه کاراکتر یک بعدی است که با یک بایت تهی به پایان می رسد.

یک بایت تهی یک بایت است که هر بیت آن برابر با صفر است، در حالی که کاراکتر ثابت ´\0´ (یک پایان دهنده خط یا پایان دهنده تهی) برای بایت تهی تعریف شده است. بنابراین، اگر یک رشته باید دارای k کاراکتر باشد، عناصر k+1 باید در توضیحات آرایه مشخص شوند.

به عنوان مثال، char a; - به این معنی است که رشته می تواند شامل شش کاراکتر باشد و آخرین بایت برای صفر رزرو شده است.

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

char S="کار با رشته ها";

نیازی به تعیین صریح کاراکتر ´\0´ در انتهای یک ثابت رشته نیست.

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

x = "BSUIR";

x = (i>0)؟ "مثبت": (i<0)? "отрицательное":"нулевое";

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

scanf()- مقادیری را برای متغیرهای رشته ای با یک مشخص کننده ورودی معرفی می کند %sقبل از ظاهر شدن اولین کاراکتر "space" (کاراکتر "&" لازم نیست قبل از شناسه داده رشته ای مشخص شود).

می گیرد()- وارد کردن یک خط با فاصله های داخل این خط با فشار دادن کلید ENTER کامل می شود.

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

خطوط توسط توابع printf() یا puts() تا اولین بایت تهی ('\0') خروجی می شوند:

printf()مکان نما را پس از خروجی به ابتدای یک خط جدید منتقل نمی کند.

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

مثلا:

printf(" یک رشته بدون فاصله وارد کنید: \n");

scanf("%s",Str);

puts ("یک رشته را وارد کنید");

عملیات باقی مانده روی رشته ها با استفاده از توابع استاندارد کتابخانه ای که نمونه های اولیه آنها در فایل توضیح داده شده است انجام می شود رشته.h. بیایید به متداول ترین توابع مورد استفاده نگاهی بیندازیم.

تابع int strlen(char *S) طول رشته (تعداد کاراکترهای رشته) را بدون توجه به بایت تهی پایان دهنده برمی گرداند.

char *S1=”Minsk!\0”, S2=”BSUIR-Hurrah!”;

printf(" %d، %d ."، strlen(S1)، strlen(S2));

نتیجه این بخش از برنامه:

تابع int strcpy(char *S1، char *S2) - محتویات رشته S2 را در رشته S1 کپی می کند.

عملکرد strcat(char *S1، char *S2) - رشته S2 را به رشته S1 می پیوندد و آن را در آرایه ای که رشته S1 بود قرار می دهد، در حالی که رشته S2 تغییر نکرده است. بایت تهی که رشته پایان یافته S1 با اولین کاراکتر رشته S2 جایگزین می شود.

تابع int strcmp(char *S1، char *S2) رشته های S1 و S2 را با هم مقایسه می کند و مقدار را برمی گرداند.<0, если S10 اگر S1>S2; = 0 اگر رشته ها برابر باشند، یعنی. شامل همان تعداد کاراکتر یکسان است.

توابع تبدیل رشته S به عدد:

عدد صحیح: int اتوی(char*S)؛

عدد صحیح طولانی: طولانی اتل(char*S)؛

واقعی: دو برابر اتوف(char*S)؛

در صورت خطا، این توابع 0 را برمی گرداند.

توابع تبدیل عدد V به رشته S.

»آژانس سئو قابل اعتماد هند می تواند درآمد کسب و کارهای کوچک را افزایش دهد

80٪ کاربران قبل از خرید در گوگل و سایر موتورهای جستجو جستجو می کنند و بیش از 50٪ درخواست های ایجاد شده از طریق موتورهای جستجو تبدیل می شوند. این دو آمار اهمیت بهینه سازی موتورهای جستجو را اثبات می کند. آمارها و حقایق زیادی وجود دارد که یک نکته واضح را نشان می دهد: هر کسب و کار کوچک، متوسط ​​یا بزرگ به خدمات سئو حرفه ای نیاز دارد. کسب و کارهای کوچک و استارت آپ ها اغلب با مشکلات بودجه مواجه هستند. آنها می توانند برای افزایش درآمد خود از هر آژانس سئو قابل اعتماد از هند کمک بگیرند تا بهترین خدمات سئو را در بودجه خود دریافت کنند.
جستجو تاثیر زیادی بر ذهن مصرف کنندگان دارد. با توجه به آمارهای مختلفی که توسط کارشناسان اصلی بهینه سازی موتورهای جستجو در وب سایت های مجاز مختلف مانند Search Engine Land، Moz، SEO Journal، Digital Marketers India، Hubspot و غیره به اشتراک گذاشته شده است. سئو اکثریت سرنخ ها را به خود اختصاص می دهد. همچنین، سرنخ های حاصل از نتایج جستجوی ارگانیک، نرخ تبدیل بالاتری دارند. این آمار و رفتار مصرف کننده این نکته را واضح تر نشان می دهد که بهترین خدمات سئو یک کالای لوکس نیست، بلکه یک ضرورت برای هر کسب و کاری است.
برای دور زدن رقابت و افزایش رشد کسب و کار، هر سازمانی باید از خدمات بهینه سازی موتورهای جستجو استفاده کند. برندهای بزرگ می توانند پول کافی را برای خدمات تخصصی SEO که توسط یک شرکت برتر SEO یا یک متخصص سئو ارائه می شود، سرمایه گذاری کنند، اما صاحبان مشاغل کوچک اغلب به دلیل بودجه کمتر، کیفیت این خدمات را به خطر می اندازند. این یک واقعیت سخت است که کسب‌وکارهای کوچک و استارت‌آپ‌ها در نهایت فرصت‌هایی را که می‌توان با خدمات سئو حرفه‌ای ایجاد کرد را ترک می‌کنند یا از یک سرویس سئو ارزان استفاده می‌کنند که هیچ نتیجه مثبتی به همراه ندارد.
صاحبان مشاغل کوچک و استارت آپ ها می توانند از خدمات حرفه ای SEO حتی در بودجه محدود نیز بهره مند شوند. بهترین راه حل پیدا کردن یک شرکت سئو قابل اعتماد مستقر در خارج از هند است. در هند، بسیاری از کارشناسان سئو هستند که با آژانس بازاریابی دیجیتال کار می کنند و بهترین خدمات را در صنعت ارائه می دهند. آنها می توانند خدمات سئو مورد نیاز را در بودجه شما به شما ارائه دهند. دستمزدها را می توان با یک آژانس SEO در هند برای دریافت خدمات بهتر با نرخ های پایین تر مذاکره کرد. با این حال، به دنبال خدمات سئوی ارزانی نباشید که هزینه کمتری دارد و قول می‌دهید که بیشتر ارائه دهید زیرا تخصص به قیمت خودش تمام می‌شود. قبل از عقد قرارداد با یک شرکت برای کسب و کار خود، باید نمونه کارها را ببینید یا سؤالات مناسب بپرسید.
کارشناسان سئو در هند با بهترین شیوه های بهینه سازی موتور جستجو ماهر هستند. همچنین، برخی از متخصصان سئو در هند مانند Ash Vyas وجود دارند که در ایجاد بهترین استراتژی بهینه‌سازی موتور جستجو برای یک تجارت با بودجه اعلام شده تخصص دارند. متخصصان سئو یک برنامه واضح ایجاد می کنند و همچنین نتایج مورد انتظار را به اشتراک می گذارند. به این ترتیب می توانید به خوبی از سرمایه گذاری و بازدهی خود آگاه شوید. این به تصمیم گیری بهتر تجاری کمک می کند.
یک ایده خوب این است که یک شرکت سئو قابل اعتماد از هند را پیدا کنید و با آن قرارداد ببندید که بهترین خدمات سئو را در اسرع وقت ارائه دهد. همچنین می‌توانید با بودجه کم و فعالیت‌های محدود شروع به فهرست‌بندی صفحات وب خود و تقویت کلمات کلیدی خود در موتورهای جستجو کنید. منتظر زمان مناسب یا روزی نباشید که هزاران دلار برای سرمایه گذاری در بهترین خدمات سئو در اختیار داشته باشید. شروع زود هنگام به شما کمک می کند تا زمانی که بتوانید با رویکرد بازاریابی خود تهاجمی پیش بروید، نتایج سریع تری به دست آورید. یک شرکت قابل اعتماد SEO مستقر در هند به شما کمک می کند تا برنامه های فعلی و آینده خود را برای به دست آوردن نتایج خوب تعریف کنید. صفحات ایندکس شده بیشتر رتبه‌بندی و برند معتبر کسب‌وکار شما را که با روش‌های سئو حرفه‌ای مستمر ساخته شده‌اند، پرس و جو، کسب‌وکار و درآمد را دو چندان می‌کند. هر کسب و کار کوچکی می تواند با سرمایه گذاری دو رقمی در خدمات سئو حرفه ای شروع به کار کند. بسیاری از آژانس‌های سئو در هند وجود دارند که بودجه کم را ارائه می‌کنند و در عین حال از خدمات بهینه‌سازی موتور جستجوی گرا نتیجه می‌گیرند.

نظرسنجی از تبعید

  • کریگ وی

    12.04.2018

    »اهمیت برقراری ارتباط با مشتری در فروش املاک و مستغلات

    اهمیت برقراری ارتباط با مشتری
    برقراری ارتباط با مشتری باید به دست آید و باید به عنوان بخشی جدایی ناپذیر از فرآیند فروش مورد توجه قرار گیرد.
    برای اینکه مشتری و خودتان را وادار به ارتباط واقعی یک به یک کنید، شامل دو چیز است!
    اول، شما باید آگاه باشید و آنجا باشید! دوم باید بدانید که دو مرحله مختلف در طول این فرآیند رخ می دهد.
    الف-آنجا باش-یعنی چی؟
    o اکثر مردم در حین صحبت کردن به دیگران واقعاً گوش نمی دهند. عموماً آن‌ها آنقدر مشغول فرمول‌بندی پاسخ یا بیانیه بعدی خود هستند که واقعاً نمی‌توانند گوش کنند.
    o اگر این به نظر شما می آید، حضور در آنجا به معنای ساکت شدن و گوش دادن است!
    ب-مرحله اول یا اولیه چیست؟
    o معمولاً شما فقط چند دقیقه فرصت دارید تا خود را در ذهن مشتریان به عنوان فردی که می خواهند با او معامله کنند، تثبیت کنید.
    o در مواقعی که شک دارید، بهتر است ابتدا سؤالاتی بپرسید که آنها را بیرون بکشد و در مورد خود صحبت کنید.
    o همچنین همیشه بی خطر است که به عنوان یک حرفه ای ظاهر شوید - منظورم رواقی یا خشک نیست، بلکه کسی است که می داند چه کار می کند و صحبت می کند و به آن قسمت نگاه می کند.
    ج- سایر مراحل
    o با گذشت زمان، از طریق گفتگو و سؤالاتی که آنها خواهند داشت، یا توانایی خود را ثابت خواهید کرد یا خیر.
    o حواستان باشد که احتمالا برای مدتی شما را می سنجند. خبر خوب این است که در مقطعی، اگر در برقراری رابطه موفق بوده اید، آنها آرام می شوند و هر دو می توانید روی یافتن یا فروش خانه تمرکز کنید.
    چه چیز دیگری می تواند به من در ایجاد رابطه کمک کند؟
    o با تلاش برای درک تیپ های مختلف شخصیت و سپس با گفتن و پرسیدن سوالات مناسب.
    o اگر رابطه خوبی دارید (در طول موجی مشابه مشتری قرار بگیرید) پس فروش اساساً به پایان رسیده است، اکنون فقط موضوع یافتن خانه مناسب یا پر کردن اوراق فهرست است.
    در مورد شخصیت های مختلف چطور
    o از آنجایی که این کتابی در زمینه روانپزشکی نیست، در حال حاضر فقط دو نوع اصلی را درک کنید.
    o افراد درونگرا و برونگرا وجود دارند.
    o نوع آن را می شناسید. در مورد سه نفری که می شناسید و متناسب با هر طبقه بندی هستند فکر کنید.
    در مورد زبان بدن و الگوهای گفتاری چطور؟
    o اگر تند یا آهسته صحبت می کنند، سعی کنید از الگوهای گفتاری آنها تقلید کنید.
    o اگر با صدای بلند یا آرام صحبت می کنند، همین کار را انجام دهید. آیا آنها به جلو متمایل هستند یا به عقب؟
    o نیازی به گفتن نیست که کتابهای زیادی در این زمینه نوشته شده است. فقط توجه داشته باشید که این یک عامل مهم است - به خصوص زمانی که در یک اتاق کنفرانس یا در خانه شخصی نشسته اید و در مورد یک معامله 400000 دلاری بحث می کنید.
    ایجاد ارتباط، مهارتی است که می توان آن را آموخت و آن را بهبود بخشید.
    o همه‌ی ما فروشنده‌ای را تجربه کرده‌ایم که چیزی را به ما فروخته، اما ما احساس نمی‌کنیم که ما را می‌فروشند. دلیلش این است که او باعث شده در جایی که به آنها اعتماد دارید احساس راحتی کنید.
    چگونه رابطه را توسعه دهیم؟
    o از چشم و گوش خود استفاده کنید و سوال بپرسید. توضیح دادن
    o استفاده از چشم:
    o به لباس آنها - ماشین - دارایی های شخصی آنها نگاه کنید و واقعاً منظورم این است که به آنها نگاه کنید و رمزگشایی کنید که آنچه در مورد آنها به شما می گوید.
    o از گوش ها استفاده کنید:
    o به آنچه آنها می گویند گوش دهید و سؤال بپرسید تا به انگیزه واقعی آنها برسید!
    اکنون در طول این مکالمه، احتمالاً یکی دو چیز وجود خواهد داشت که با آنها مشترک هستید. (خانواده، مناطق جغرافیایی، ماهیگیری، و غیره) هنگامی که به نقاط مشترکی برخورد کردید، به آنها اطلاع دهید که با آنها آشنایی دارید و سپس یک دقیقه در مورد آن صحبت کنید.
    هدف چیست؟
    o هنگامی که آنها شما را به عنوان یکی از آنها پذیرفتند، در موقعیتی هستید که واقعاً تجربه خوبی در فروش داشته باشید، زیرا اکنون با هم کار می کنید و سپس به عنوان یک تیم - شما دیگر فروشنده ای نیستید که اکنون در یک موقعیت مشاوره هستید. .
    o به یاد داشته باشید که مشتری یا به شما اجازه ورود به دنیای خود را می دهد یا نمی دهد. اگر این را درک کنید و واقعاً برای همدلی با او سخت تلاش کنید، می توانید یک موقعیت اعتماد به دست آورید. در بیشتر موارد، وقتی این اتفاق می افتد که در راه هستید، واقعاً آنها را آرام می بینید (زبان بدن).
    o برای نشان دادن این موضوع، آیا تا به حال سخنرانی کرده اید و متوجه شده اید که وقتی در نهایت با یکی از مخاطبان ارتباط برقرار می کنید، آنها به نشانه تایید سر تکان می دهند. همه این چیزها ممکن است پیش پا افتاده به نظر برسند اما اینطور نیست.
    در پایان، اگر بتوانید اعتماد مشتریان را جلب کنید، فروش یک محصول یا خدمات بسیار آسان‌تر است و این تجربه می‌تواند برای همه افراد آزاردهنده باشد.
    همیشه به یاد داشته باشید که برد/برد بهترین موقعیت است.

استاندارد C++ مدرن کلاسی را با توابع و ویژگی ها (متغیرها) برای سازماندهی کار با رشته ها تعریف می کند (در زبان کلاسیک C رشته ای وجود ندارد، فقط آرایه های char وجود دارد):

#عبارتند از

#عبارتند از

#عبارتند از

برای کار با رشته ها، باید یک فضای نام استاندارد نیز در نظر بگیرید:

استفاده از namespace std.

در غیر این صورت، شما باید به جای رشته در همه جا، توصیفگر کلاس std::string را مشخص کنید.

در زیر نمونه ای از برنامه ای است که با رشته کار می کند (در کامپایلرهای قدیمی سازگار با C کار نمی کند!):

#عبارتند از #عبارتند از #عبارتند از با استفاده از namespace std. int main() (string s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->erase(s2->end()); کوت<< s2->c_str(); cin.get(); بازگشت 0; )

ویژگی های اصلی که کلاس رشته دارد:

  • مقداردهی اولیه با آرایه ای از کاراکترها (رشته داخلی) یا شی دیگری از نوع رشته. نوع توکار قابلیت دوم را ندارد.
  • کپی کردن یک خط به خط دیگر برای یک نوع داخلی، باید از تابع strcpy() استفاده کنید.
  • دسترسی به کاراکترهای جداگانه یک رشته برای خواندن و نوشتن. در آرایه داخلی، این کار با استفاده از عملیات شاخص یا آدرس دهی غیرمستقیم با استفاده از یک اشاره گر انجام می شود.
  • مقایسه دو رشته برای برابری برای یک نوع داخلی، از توابع خانواده strcmp() استفاده می شود.
  • الحاق (الحاق) دو رشته که نتیجه را یا به عنوان یک رشته سوم یا به جای یکی از رشته های اصلی می دهد. برای یک نوع داخلی، از تابع strcat() استفاده می شود، اما برای به دست آوردن نتیجه در یک خط جدید، باید از توابع strcpy() و strcat() به ترتیب استفاده کنید و همچنین مراقب تخصیص حافظه باشید.
  • ابزار داخلی برای تعیین طول یک رشته (توابع عضو کلاس size() و l ength()). تنها راه برای پی بردن به طول یک رشته نوع داخلی، محاسبه آن با تابع strlen() است.
  • توانایی یافتن خالی بودن یک رشته.

بیایید نگاهی دقیق تر به این ویژگی های اساسی بیندازیم.

مقداردهی اولیه رشتههنگام توصیف و طول رشته(بدون احتساب پایان دهنده تهی پایان دهنده):

String st("رشته من\n"); کوت<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";

رشته همچنین می تواند خالی باشد:

رشته st2;

برای بررسی اینکه آیا رشته خالی است، می توانید طول آن را با 0 مقایسه کنید:

اگر (!st.size()) // خالی باشد

یا از متد ()() استفاده کنید که برای یک رشته خالی true و برای رشته غیر خالی false را برمی گرداند:

if (st.empty()) // خالی

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

رشته st3(st);

رشته st3 با رشته st مقدار دهی اولیه می شود. چگونه می توانیم مطمئن شویم که اینها رشته ها مطابقت دارند? بیایید از عملگر مقایسه (==):

اگر (st == st3) // مقداردهی اولیه با موفقیت انجام شد

چگونه یک خط را به خط دیگر کپی کنید? با عملگر انتساب معمول:

st2 = st3; // st3 را در st2 کپی کنید

برای الحاق رشتهعملگر جمع (+) یا عملگر جمع-انتساب (+=) استفاده می شود. بگذارید دو خط داده شود:

رشته s1("سلام،"); رشته s2("world\n");

می‌توانیم یک رشته سوم متشکل از الحاق دو مورد اول بدست آوریم، به این ترتیب:

رشته s3 = s1 + s2;

اگر بخواهیم s2 را به انتهای s1 اضافه کنیم باید بنویسیم:

S1 += s2;

عملیات جمع می تواند اشیاء کلاس را به هم متصل کند رشتهنه تنها در بین خود، بلکه با رشته هایی از نوع داخلی. می‌توانید مثال بالا را به گونه‌ای بازنویسی کنید که کاراکترهای خاص و علائم نگارشی با نوع داخلی char * نمایش داده شوند و کلمات قابل توجه اشیاء رشته کلاس هستند:

Const char *pc = ", "; رشته s1 ("سلام"); رشته s2 ("جهان"); رشته s3 = s1 + pc + s2 + "\n"; کوت<< endl << s3;

چنین عباراتی کار می کنند زیرا کامپایلر "می داند" چگونه به طور خودکار اشیاء از نوع داخلی را به اشیاء رشته کلاس تبدیل کند. همچنین می توان به سادگی یک رشته داخلی را به یک شی رشته اختصاص داد:

رشته s1; const char *pc = "یک آرایه کاراکتر"; s1=pc; // درست

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

Char*str = s1; // خطای کامپایل

برای انجام این تبدیل، باید به صراحت تابع عضوی به نام c_str() ("رشته C") را فراخوانی کنید.

Const char *str = s1.c_str();

تابع ()c_str یک اشاره گر را به یک آرایه کاراکتری حاوی رشته شی رشته، همانطور که در نوع رشته داخلی است، برمی گرداند. کلمه کلیدی const در اینجا از امکان "خطرناک" در محیط های بصری مدرن تغییر مستقیم محتویات یک شی از طریق یک اشاره گر جلوگیری می کند.

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

String str("www.disney.com"); int size = str.size(); برای (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;

Replace(str.begin()، str.end()، "."، "_");

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

#عبارتند از

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

در زیر شرح مختصری از عملگرها و عملکردهای کلاس رشته ارائه شده است، پیوندهای موجود در جدول منجر به توضیحات به زبان روسی در اینترنت می شوند. برای فهرست کامل‌تر از قابلیت‌های کلاس رشته، به عنوان مثال به Wikipedia یا cplusplus.com مراجعه کنید.

تعیین کاراکترها در یک رشته

اپراتور=

مقادیر را به یک رشته اختصاص می دهد

اختصاص دهد

کاراکترها را به یک رشته اختصاص می دهد

دسترسی به شخصیت های فردی

در

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

اپراتور

دریافت شخصیت مشخص شده

جلو

گرفتن شخصیت اول

بازگشت

گرفتن آخرین شخصیت

داده ها

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

c_str

برمی گرداند غیر قابل تغییرآرایه کاراکتر C حاوی کاراکترهای رشته

بررسی ظرفیت رشته

خالی

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

اندازه
طول

تعداد کاراکترهای یک رشته را برمی گرداند

حداکثر_اندازه

حداکثر تعداد کاراکترها را برمی گرداند

ذخیره

فضای ذخیره سازی را رزرو می کند

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

روشن

محتویات رشته را پاک می کند

درج کنید

درج کاراکتر

پاک کردن

حذف شخصیت

push_back

اضافه کردن یک کاراکتر به انتهای رشته

pop_back

آخرین کاراکتر را حذف می کند

ضمیمه

عملگر+=

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

مقایسه کنید

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

جایگزین کردن

هر اتفاقی از کاراکتر مشخص شده را جایگزین می کند

substr

یک رشته فرعی را برمی گرداند

کپی 🀄

شخصیت ها را کپی می کند

تغییر اندازه

تعداد کاراکترهای ذخیره شده را تغییر می دهد

رشته های. ورودی/خروجی خط I/O فرمت شده پردازش رشته با استفاده از توابع استاندارد زبان C. کار با حافظه.

1.1. اعلام و مقداردهی اولیه رشته ها.

رشته آرایه ای از کاراکترها است که با کاراکتر خالی '\0' خاتمه می یابد. یک رشته به عنوان یک آرایه کاراکتر معمولی اعلام می شود، برای مثال،

char s1; // رشته نه کاراکتر

char*s2; // اشاره گر به رشته

تفاوت بین نشانگرهای s1 و s2 در این است که نشانگر s1 یک ثابت نامگذاری شده است، در حالی که نشانگر s2 یک متغیر است.

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

"این یک رشته است."

طول یک ثابت رشته طبق استاندارد نمی تواند از 509 کاراکتر تجاوز کند. با این حال، بسیاری از پیاده سازی ها رشته های طولانی تری را امکان پذیر می کنند.

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

char s1 = "این یک رشته است.";

در زبان برنامه نویسی C تعداد زیادی توابع برای کار با رشته ها وجود دارد که نمونه های اولیه آن در فایل های هدر stdlib.h و string.h توضیح داده شده است. کار با این توابع در پاراگراف های بعدی مورد بحث قرار خواهد گرفت.

1.2. ورودی/خروجی خط

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

char* gets(char*str);

که یک رشته به آدرس str می نویسد و آدرس رشته ورودی را برمی گرداند. اگر تابع با کاراکتر '\n' یا EOF (پایان فایل) مواجه شود، ورودی را متوقف می کند. کاراکتر خط جدید کپی نشده است. یک بایت تهی در انتهای خط خواندن قرار می گیرد. در صورت موفقیت، تابع یک اشاره گر به خط خوانده شده و در صورت شکست، NULL را برمی گرداند.

برای خروجی یک رشته به کنسول، از تابع استاندارد استفاده کنید

int قرار می دهد (const char *s);

که عدد غیر منفی را در مورد موفقیت و EOF را در شکست برمی گرداند.

نمونه های اولیه تابع gets و puts در فایل هدر stdio.h توضیح داده شده است.

#عبارتند از

printf("رشته ورودی:");

1.3. I/O فرمت شده

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

int scanf (const char *format, ...);

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

نویسه‌های Space، "\t" یا "\n" در رشته قالب یک یا چند کاراکتر خالی را در جریان ورودی توصیف می‌کنند که شامل کاراکترهای زیر است: space، '\t'، '\n'، '\v'، '\f'. تابع scanf از کاراکترهای تهی در جریان ورودی عبور می کند.

کاراکترهای واقعی در یک رشته قالب، به استثنای کاراکتر %، دقیقاً به همان کاراکترها نیاز دارند تا در جریان ورودی ظاهر شوند. اگر چنین کاراکتری وجود نداشته باشد، scanf ورودی را متوقف می کند. تابع scanf از کاراکترهای تحت اللفظی عبور می کند.

به طور کلی، مشخصات فرمت ورودی:

%[*] [width] [modifiers] نوع

کاراکتر '*' نشان دهنده یک شکاف هنگام ورود به یک فیلد تعریف شده توسط این مشخصات است.

- "width" حداکثر تعداد کاراکترهای وارد شده توسط این مشخصات را مشخص می کند.

نوع می تواند مقادیر زیر را داشته باشد:

c یک آرایه کاراکتر است،

s – رشته کاراکتر، رشته ها با کاراکترهای خالی از هم جدا می شوند.

d یک عدد صحیح با 10 ثانیه در ثانیه است،

i یک عدد صحیح امضا شده است، سیستم اعداد بر اساس دو رقم اول است،

u یک عدد صحیح بدون علامت در 10 ثانیه بر ثانیه است،

o یک عدد صحیح بدون علامت در 8 s/s است،

x، X یک عدد صحیح بدون علامت در 16 s/s است،

e، E، f، g، G - عدد شناور،

p یک اشاره گر به یک اشاره گر است،

n یک اشاره گر به یک عدد صحیح است،

[…] آرایه ای از کاراکترهای اسکن شده است، به عنوان مثال، .

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

اصلاح کننده ها می توانند مقادیر زیر را بگیرند:

h یک عدد صحیح کوتاه است،

l، L - عدد صحیح طولانی یا شناور،

و فقط برای اعداد صحیح یا شناور استفاده می شود.

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

#عبارتند از

printf("یک عدد صحیح وارد کنید:");

scanf("%d"، &n);

printf("input a double:");

scanf("%lf"، &d);

printf("یک کاراکتر را وارد کنید:");

scanf("%c"، &c);

printf("یک رشته را وارد کنید:");

scanf("%s"، &s);

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

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

int printf (const char *format, ...);

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

%[flags] [width] [.precision] [modifiers] نوع

- "پرچم ها" نمادهای مختلفی هستند که فرمت خروجی را مشخص می کنند.

- "width" حداقل تعداد کاراکترهای خروجی توسط این مشخصات را مشخص می کند.

- ".precision" حداکثر تعداد کاراکترهای خروجی را مشخص می کند.

- "تغییر کننده ها" نوع آرگومان ها را مشخص می کنند.

- 'type' نوع آرگومان را مشخص می کند.

فرمت خروجی زیر برای چاپ اعداد صحیح امضا شده استفاده می شود:

%[-] [+ | فضا] [عرض] [l] د

- - تراز به چپ، به طور پیش فرض - به سمت راست.

+ - علامت '+' نمایش داده می شود، توجه داشته باشید که برای اعداد منفی علامت '-' همیشه نمایش داده می شود.

"فضا" - یک فاصله در موقعیت کاراکتر نمایش داده می شود.

d نوع داده int است.

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

%[-] [#] [عرض] [l]

# - 0 اولیه را برای اعداد در 8 c/c یا 0x اولیه یا 0X را برای اعداد در 16 c/c نمایش می دهد.

l - اصلاح کننده نوع داده طولانی؛

u یک عدد صحیح در 10c/c است،

o یک عدد صحیح در 8 c/c است،

x، X یک عدد صحیح در 16 c/c است.

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

%[-] [+ | فضا] [عرض] [دقت]

«دقت» به تعداد ارقام بعد از نقطه اعشار برای قالب‌های f، e، و E یا تعداد ارقام مهم برای قالب‌های g و G اشاره دارد. اعداد گرد می‌شوند. پیش فرض شش رقم اعشاری با دقت است.

f یک عدد نقطه ثابت است،

e یک عدد به صورت نمایی است، توان با حرف "e" نشان داده می شود.

E یک عدد به صورت نمایی است، توان با حرف "E" نشان داده می شود.

g کوتاه ترین فرمت f یا g است،

G کوتاه ترین فرمت f یا G است.

printf ("n = %d\n f = %f\n e = %e\n E = %E\n f = %.2f"، -123، 12.34، 12.34، 12.34، 12.34);

// چاپ: n = 123 f = 12.340000 e = 1.234000e+001 E = 1.234000E+001 f = 12.34

1.4. قالب بندی رشته

انواع توابع scanf و printf وجود دارد که برای قالب بندی رشته ها طراحی شده اند و به ترتیب sscanf و sprintf نامیده می شوند.

int sscanf (const char *str, const char *format, ...);

داده ها را از رشته مشخص شده توسط پارامتر str با توجه به رشته فرمت مشخص شده توسط پارامتر format می خواند. مقدار داده های خوانده شده در مورد موفقیت، EOF در هنگام شکست را برمی گرداند. مثلا،

#عبارتند از

char str = "a 10 1.2 String No input";

sscanf(str، "%c %d %lf %s"، &c، &n، &d، s);

printf("%c\n"، c); // چاپ می کند: الف

printf("%d\n"، n); // چاپ: 10

printf("%f\n"، d); // چاپ: 1.200000

printf("%s\n"، s); // چاپ: رشته

int sprintf (char *buffer, const char *format, ...);

رشته را با توجه به فرمت مشخص شده توسط پارامتر فرمت فرمت می کند و نتیجه را در آرایه کاراکتر بافر می نویسد. تابع تعداد کاراکترهای نوشته شده به آرایه کاراکترهای بافر را به استثنای بایت تهی انتهایی برمی گرداند. مثلا،

#عبارتند از

char str = "c = %c، n = %d، d = %f، s = %s";

char s = "این یک رشته است.";

sprintf (بافر، str، c، n، d، s)؛

printf("%s\n"، بافر); // چاپ می کند: c = c، n = 10، d = 1.200000، s = این یک رشته است

1.5. رشته ها را به داده های عددی تبدیل کنید.

نمونه اولیه توابع برای تبدیل رشته ها به داده های عددی در فایل هدر stdlib.h آورده شده است که باید در برنامه گنجانده شود.

برای تبدیل رشته به عدد صحیح از تابع استفاده کنید

int atoi (const char *str);

char *str = "-123";

n = atoi(str); // n = -123

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

long int atol (const char *str);

که در صورت موفقیت آمیز بودن، عدد صحیحی را که رشته str به آن تبدیل شده است و در صورت ناموفق بودن عدد 0 را برمی گرداند.

char *str = "-123";

n = atol(str); // n = -123

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

دو اتوف (const char *str);

که در صورت موفقیت یک عدد شناور از نوع double که رشته رشته به آن تبدیل می شود و در صورت خرابی 0 را برمی گرداند.

char *str = "-123.321";

n = atof(str); // n = -123.321

توابع زیر اقدامات مشابه atoi، atol، atof را انجام می دهند، اما عملکرد بیشتری را ارائه می دهند.

طولانی int strtol (const char *str، char **endptr، int base);

رشته str را به int طولانی تبدیل می کند که آن را برمی گرداند. پارامترهای این تابع هدف زیر را دارند.

اگر آرگومان پایه 0 باشد، تبدیل به دو کاراکتر اول str بستگی دارد:

اگر کاراکتر اول یک رقم از 1 تا 9 باشد، فرض می شود که عدد در 10 c/c نشان داده شود.

اگر کاراکتر اول عدد 0 و کاراکتر دوم عددی از 1 تا 7 باشد، در این صورت عدد در 8 c/c در نظر گرفته می‌شود.

اگر کاراکتر اول 0 و کاراکتر دوم «X» یا «x» باشد، آنگاه عدد در 16 c/c در نظر گرفته می‌شود.

اگر آرگومان پایه یک عدد از 2 تا 36 باشد، این مقدار به عنوان پایه سیستم اعداد در نظر گرفته می شود و هر کاراکتری که فراتر از این سیستم باشد، تبدیل را متوقف می کند. سیستم های اعداد با پایه 11 تا 36 از نمادهای 'A' تا 'Z' یا 'a' به 'z' برای نمایش ارقام استفاده می کنند.

مقدار آرگومان endptr توسط تابع strtol تنظیم می شود. این مقدار حاوی یک اشاره گر به کاراکتری است که تبدیل str را متوقف می کند. تابع strtol عدد تبدیل شده را در صورت موفقیت و 0 را در صورت شکست برمی گرداند.

n = strtol("12a"، &p، 0);

printf("n = %ld، %stop = %c، n، *p); // n = 12، توقف = a

n = strtol("012b"، &p، 0);

printf("n = %ld، %stop = %c، n، *p); // n = 10، توقف = ب

n = strtol("0x12z"، &p، 0);

printf("n = %ld، %stop = %c، n، *p); // n = 18، توقف = z

n = strtol("01117"، &p، 0);

printf("n = %ld، %stop = %c، n، *p); // n = 7، توقف = 7

strtol طولانی int بدون علامت (const char *str, char **endptr, int base);

شبیه تابع strtol کار می کند، اما نمایش کاراکتر یک عدد را به یک int طولانی بدون علامت تبدیل می کند.

دو strtod (const char *str، char **endptr);

نمایش نمادین یک عدد را به دوتایی تبدیل می کند.

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

علاوه بر این، اگر مقدار کاراکتر یک عدد از محدوده مقادیر مجاز برای نوع داده مربوطه بیشتر شود، توابع atof، strtol، strtoul، strtod مقدار متغیر errno را روی ERANGE تنظیم می کنند. متغیر errno و ثابت ERANGE در فایل هدر math.h تعریف شده است. توابع atof و strtod HUGE_VAL، تابع strtol LONG_MAX یا LONG_MIN و تابع strtoul ULONG_MAX را برمی گرداند.

توابع غیر استاندارد itoa، ltoa، utoa، ecvt، fcvt و gcvt را می توان برای تبدیل داده های عددی به رشته های کاراکتری استفاده کرد. اما بهتر است از تابع استاندارد sprintf برای این اهداف استفاده کنید.

1.6. توابع استاندارد برای کار با رشته ها.

در این قسمت توابعی برای کار با رشته ها در نظر گرفته شده است که نمونه های اولیه آن در فایل هدر string.h توضیح داده شده است.

1. مقایسه رشته.از توابع strcmp و strncmp برای مقایسه رشته ها استفاده می شود.

int strcmp (const char *str1, const char *str2);

رشته‌های str1، str2 را از نظر لغوی مقایسه می‌کند و اگر str1 به ترتیب کوچک‌تر، مساوی یا بزرگ‌تر از str2 باشد، -1، 0 یا 1 را برمی‌گرداند.

int strncmp (const char *str1, const char *str2, size_t n);

حداکثر n کاراکتر اول از رشته های str1 و str2 را از نظر لغوی مقایسه می کند. اگر n کاراکتر اول str1 به ترتیب کوچکتر، مساوی یا بزرگتر از n کاراکتر اول str2 باشد، تابع 1-، 0 یا 1 را برمی گرداند.

// مثال مقایسه رشته

#عبارتند از

#عبارتند از

char str1 = "aa bb";

char str2 = "aa aa";

char str3 = "aa bb cc";

printf("%d\n", strcmp(str1, str3)); // چاپ: -1

printf("%d\n", strcmp(str1, str1)); // چاپ: -0

printf("%d\n", strcmp(str1, str2)); // چاپ: 1

printf("%d\n", strncmp(str1, str3, 5)); // چاپ: 0

2. کپی کردن خطوط.از توابع strcpy و strncpy برای کپی رشته ها استفاده می شود.

char *strcpy (char *str1, const char *str2);

رشته str2 را در رشته str1 کپی می کند. رشته str2 به طور کامل، از جمله بایت تهی انتهایی، کپی می شود. تابع یک اشاره گر را به str1 برمی گرداند. اگر خطوط با هم همپوشانی داشته باشند، نتیجه غیر قابل پیش بینی است.

char *strncpy (char *str1, const char *str2, size_t n);

n کاراکتر را از رشته str2 به رشته str1 کپی می کند. اگر رشته str2 کمتر از n کاراکتر داشته باشد، آخرین بایت تهی به تعداد دفعات مورد نیاز برای گسترش رشته str2 به n کاراکتر کپی می شود. تابع یک اشاره گر به رشته str1 برمی گرداند.

char str2 = "کپی رشته.";

strcpy(str1, str2);

printf(str1); // prints: رشته کپی.

4. رشته های اتصال.از توابع strcat و strncat برای الحاق رشته ها به یک رشته استفاده می شود.

char* strcat (char *str1, const char *str2);

رشته str2 را به رشته str1 اضافه می کند و بایت تهی انتهای رشته str1 پاک می شود. تابع یک اشاره گر به رشته str1 برمی گرداند.

char* strncat (char *str1, const char *str2, size_t n);

n کاراکتر را از رشته str2 به رشته str1 الحاق می کند و بایت تهی انتهایی str1 را پاک می کند. تابع یک اشاره گر به رشته str1 برمی گرداند. اگر طول رشته str2 کمتر از n باشد، فقط کاراکترهای موجود در رشته str2 اضافه می شوند. پس از الحاق رشته ها، همیشه یک بایت تهی به str1 اضافه می شود. تابع یک اشاره گر به رشته str1 برمی گرداند.

#عبارتند از

#عبارتند از

char str1 = "رشته";

char str2 = "catenation";

char str3 = "بله خیر";

strcat(str1, str2);

printf("%s\n", str1); // prints: string catenation

strncat(str1, str3, 3);

printf("%s\n", str1); // چاپ: کاتناسیون رشته بله

5. یک کاراکتر را در یک رشته جستجو کنید.توابع strchr، strrchr، strspn، strcspn و strpbrk برای جستجوی یک کاراکتر در یک رشته استفاده می شود.

char* strchr (const char *str, int c);

اولین رخداد کاراکتر مشخص شده توسط پارامتر c را در رشته str جستجو می کند. در صورت موفقیت، تابع یک اشاره گر به اولین کاراکتر پیدا شده و در صورت شکست، NULL را برمی گرداند.

char* strrchr (const char *str, int c);

آخرین رخداد کاراکتر مشخص شده توسط پارامتر c را در رشته str جستجو می کند. در صورت موفقیت، تابع یک اشاره گر به آخرین کاراکتر پیدا شده و در صورت شکست، NULL را برمی گرداند.

#عبارتند از

#عبارتند از

char str = "جستجوی کاراکتر";

printf("%s\n"، strchr(str، "r")); // چاپ: r جستجو

printf("%s\n"، strrchr(str، "r")); // چاپ: rch

size_t strspn (const char *str1, const char *str2);

ایندکس اولین کاراکتر در str1 را که در str2 نیست برمی گرداند.

size_t strcspn (const char *str1, const char *str2);

ایندکس اولین کاراکتر در str1 که در str2 است را برمی گرداند.

char str = "123 abc";

printf("n = %d\n", strspn(str, "321"); // چاپ می کند: n = 3

printf ("n = %d\n"، strcspn (str، "cba"); // چاپ: n = 4

char* strpbrk (const char *str1, const char *str2);

اولین کاراکتر در str1 را پیدا می کند که برابر با یکی از کاراکترهای str2 است. در صورت موفقیت، تابع یک اشاره گر به آن کاراکتر و در صورت شکست، NULL را برمی گرداند.

char str = "123 abc";

printf("%s\n"، strpbrk(str، "bca")); // چاپ: abc

6. مقایسه رشته ها.تابع strstr برای مقایسه رشته ها استفاده می شود.

char* strstr (const char *str1, const char *str2);

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

char str = "123 abc 456;

printf("%s\n", strstr(str, "abc"); // print: abc 456

7. تجزیه یک رشته به نشانه.تابع strtok برای تجزیه رشته به توکن استفاده می شود.

char* sttok (char *str1, const char *str2);

یک اشاره گر را به نشانه (کلمه) بعدی در رشته str1 باز می گرداند، جایی که جداکننده نشانه کاراکترهایی از رشته str2 هستند. اگر توکن ها تمام شوند، تابع NULL را برمی گرداند. در اولین فراخوانی تابع strtok، پارامتر str1 باید به رشته ای اشاره کند که به توکن تجزیه می شود و در فراخوانی های بعدی، این پارامتر باید روی NULL تنظیم شود. پس از یافتن نشانه، تابع sttok یک بایت تهی را بعد از این نشانه به جای جداکننده می نویسد.

#عبارتند از

#عبارتند از

char str = "12 34 ab cd";

p = strtok(str, " ");

printf("%s\n",p); // مقادیر را در یک ستون چاپ می کند: 12 34 ab cd

p = strtok(NULL، "");

8. تعیین طول رشته.تابع strlen برای تعیین طول یک رشته استفاده می شود.

size_t strlen(const char *str);

با نادیده گرفتن آخرین بایت تهی، طول رشته را برمی گرداند. مثلا،

char str = "123";

printf("len = %d\n",strlen(str)); // چاپ: len = 3

1.7. توابع کار با حافظه

فایل هدر string.h همچنین توابعی را برای کار با بلوک های حافظه توصیف می کند که مشابه توابع مربوطه برای کار با رشته ها هستند.

void* memchr(const void *str, int c, size_t n);

اولین رخداد کاراکتر مشخص شده توسط c را در n بایت str جستجو می کند.

int memcmp(const void *str1, const void *str2, size_t n);

n بایت اول str1 و str2 را با هم مقایسه می کند.

void* memcpy(const void *str1, const void *str2, size_t n);

n بایت اول را از رشته str1 به رشته str2 کپی می کند.

void* memmove(const void *str1, const void *str2, size_t n);

n بایت اول را از str1 به str2 کپی می کند و اطمینان حاصل می کند که رشته های همپوشانی به درستی مدیریت می شوند.

void* memset(const void *str, int c, size_t n);

کاراکتر مشخص شده توسط c را در n بایت اول str کپی می کند.