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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.2. خطوط I/O

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

char * می شود (char * str);

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

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

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

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

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

#عبارتند از

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

1.3. فرمت I/O

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

int scanf (const char * فرمت، ...);

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

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

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

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

% [*] [عرض] [تغییرکننده] نوع

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

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

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

ج - آرایه کاراکترها،

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

d - عدد صحیح امضا شده در 10 ثانیه بر ثانیه،

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

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

o - عدد صحیح بدون علامت در 8 ثانیه بر ثانیه،

x، X - عدد صحیح بدون علامت در 16 ثانیه بر ثانیه،

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 * فرمت، ...);

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

% [پرچم] [عرض] [. دقت] [تغییرکننده] نوع

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

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

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

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

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

اعداد صحیح امضا شده در قالب زیر خروجی می شوند:

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

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

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

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

د - نوع داده int.

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

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

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

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

u - عدد صحیح در 10c / s،

o - عدد صحیح در 8 ثانیه بر ثانیه،

x، X یک عدد صحیح 16 ثانیه بر ثانیه است.

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

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

«دقت» تعداد ارقام بعد از نقطه اعشار برای قالب‌های 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 =% 0.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

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

طولانی int atol (const char * str);

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

char * str = "-123";

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

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

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

که در صورت موفقیت آمیز بودن، یک عدد شناور از نوع double را برمی گرداند، که رشته str به آن تبدیل شده است، و اگر 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 ثانیه در ثانیه نشان داده شده است.

اگر کاراکتر اول یک رقم 0 و دومی یک رقم از 1 تا 7 باشد، فرض می شود که عدد در 8 c / s نشان داده شده است.

اگر کاراکتر اول 0 و دومی "X" یا "x" باشد، فرض می شود که عدد در 16 c / s نشان داده شده است.

اگر پایه عددی بین 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); // prints: string catenation بله

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"); // چاپ: abc 456

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

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

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

#عبارتند از

#عبارتند از

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 کپی می کند.

برچسب ها: خطوط C. آرایه Char.

رشته ها در C. معرفی.

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

#عبارتند از #عبارتند از void main () (char c = "A"؛ int i = 65؛ printf ("نمایش به عنوان char% c \ n"، c)؛ printf ("نمایش به عنوان int% d \ n"، c)؛ printf (" نمایش به عنوان char% c \ n "، i)؛ printf ("نمایش به عنوان char% d \ n"، i)؛ getch ();)

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

Printf ("نمایش به عنوان char% c \ n"، c);

سپس خروجی خواهد داشت
آ
اگر آن را به عنوان یک عدد خروجی بگیرید، خواهد بود
65
می توانید همین کار را با عدد 65 که در یک متغیر از نوع ذخیره شده است انجام دهید بین المللی.
کاراکترهای ویژه نیز شماره مخصوص به خود را دارند

#عبارتند از #عبارتند از void main () (printf ("% c"، "\ a")؛ printf ("% d"، "\ a")؛ printf ("% c"، 7)؛ getch ()؛)

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

#عبارتند از #عبارتند از void main () (کلمه کاراکتر؛ کلمه = "A"؛ کلمه = "B"؛ کلمه = "C"؛ کلمه = "\ 0"؛ // کلمه = 0؛ معادل printf ("% s" کلمه) ؛ گچ ()

کلید% s برای خروجی استفاده شد. این رشته را تا اولین کاراکتر پایانه چاپ می کند، زیرا تابع printf اندازه آرایه کلمه را نمی داند.
اگر در این مثال قرار ندهید

کلمه = "\ 0";

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

#عبارتند از #عبارتند از void main () (char word = "ABC"؛ char text = ("H"، "E"، "L"، "L"، "O"); printf ("% s \ n"، word) printf ("% s"، متن)؛ گرفتن ();)

در این مورد، همه چیز درست است. رشته "ABC" با صفر پایان می یابد و ما آرایه کلمه را با آن مقداردهی اولیه می کنیم. متن رشته حروف به حرف مقداردهی اولیه می شود، تمام کاراکترهای باقیمانده، همانطور که در فصل آرایه ها آمده است، با صفر پر می شوند.

خواندن خطوط

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

#عبارتند از #عبارتند از خالی اصلی () (بافر char؛ scanf ("% 19s"، بافر)؛ printf ("% s" بافر)؛ getch ()؛)

در این مورد، تعداد کاراکترهای وارد شده به 19 محدود می شود و اندازه بافر 1 بزرگتر است، زیرا لازم است یک کاراکتر پایانه ذخیره شود. بیایید یک برنامه ساده بنویسیم که از کاربر یک رشته بخواهد و طول آن را برگرداند.

#عبارتند از #عبارتند از void main () (بافر کاراکتر؛ len بدون علامت = 0؛ scanf ("% 127s"، بافر)؛ while (بافر! = "\ 0") (len ++;) printf ("طول (% s) ==% d"، بافر، لن؛ گچ ();)

از آنجایی که مقدار عددی کاراکتر "\ 0" برابر با صفر است، می توانید بنویسید

while (بافر! = 0) (لن ++؛)

یا حتی کوتاه تر

while (بافر) (len ++;)

حالا بیایید برنامه ای بنویسیم که از کاربر دو کلمه بخواهد و آنها را با هم مقایسه کند

#عبارتند از #عبارتند از / * اگر کلمه اول از نظر واژگانی بزرگتر از کلمه دوم باشد، اگر کلمه دوم بزرگتر از * / void main () باشد، اگر کلمه اول برابر با 1 باشد، نتیجه مقایسه عدد 0 خواهد بود (char firstWord; // اولین کلمه char secondWord؛ // کلمه دوم بدون علامت i; / / Counter int cmpResult = 0; // مقایسه نتیجه scanf ("% 127s"، firstWord); scanf ("% 127s"، secondWord)؛ برای ( i = 0؛ i< 128; i++) { if (firstWord[i] >secondWord [i]) (// بیشتر حتی اگر کلمه دوم قبلاً تمام شده باشد، زیرا // سپس با صفر به پایان می‌رسد cmpResult = 1؛ break;) وگرنه اگر (firstWord [i]< secondWord[i]) { cmpResult = -1; break; } } printf("%d", cmpResult); getch(); }

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

کتابخانه تابع C و C ++ شامل مجموعه ای غنی از توابع مدیریت رشته و کاراکتر است. توابع رشته‌ای بر روی آرایه‌های کاراکتری تهی کار می‌کنند. در زبان C، برای استفاده از توابع رشته، باید یک فایل هدر در ابتدای ماژول برنامه قرار دهید ، و برای نماد - فایل هدر ... C ++ از هدرها برای کار با توابع رشته و کاراکتر استفاده می کند. و به ترتیب. این فصل از نام‌های سرفصل C برای سادگی استفاده می‌کند.

از آنجایی که در زبان های C و C ++ هنگام انجام عملیات با آرایه ها، کنترل خودکار نقض مرزهای آنها وجود ندارد، تمام مسئولیت سرریز آرایه ها بر عهده برنامه نویس است. نادیده گرفتن این ظرافت ها می تواند باعث از کار افتادن برنامه شود.

در C و C ++، کاراکترهای قابل چاپ کاراکترهایی هستند که در ترمینال نمایش داده می شوند. در محیط های ASCII، آنها بین یک فاصله (0x20) و یک tilde (OxFE) قرار دارند. کاراکترهای کنترل دارای مقادیری بین صفر و Ox1F هستند. اینها همچنین شامل نماد DEL (Ox7F) هستند.

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

در عنوان نوع size_t تعریف شده است که حاصل عملگر sizeof و نوعی عدد صحیح بدون علامت است.

C99 واجد شرایط محدود را به برخی از پارامترهای چندین تابع که در ابتدا در C89 تعریف شده بودند اضافه کرده است. هر یک از این تابع ها با نمونه اولیه استفاده شده در محیط C89 (و همچنین در محیط C ++) مورد بحث قرار خواهد گرفت و پارامترهای دارای ویژگی محدود در توضیحات این تابع ذکر خواهند شد.

لیست ویژگی ها

بررسی وابستگی

isalnum - بررسی کنید که آیا یک کاراکتر حروف عددی است یا خیر
isalpha - بررسی کنید که آیا یک کاراکتر متعلق به حروف است
isblank - یک کاراکتر خالی را بررسی کنید
iscntrl - بررسی کنید که آیا یک نماد به کنترل تعلق دارد یا خیر
isdigit - بررسی کنید که آیا یک کاراکتر دیجیتالی است یا خیر
isgraph - بررسی کنید که آیا یک کاراکتر قابل چاپ است اما فضای خالی نیست
islower - بررسی کنید که آیا یک کاراکتر کوچک است یا خیر
isprint - بررسی کنید که آیا یک کاراکتر قابل چاپ است یا خیر
ispunct - بررسی کنید که آیا یک کاراکتر متعلق به علائم نگارشی است
isspace - بررسی کنید که آیا یک کاراکتر فضای خالی است یا خیر
isupper - بررسی کنید که آیا یک کاراکتر بزرگ است یا خیر
isxdigit - بررسی کنید که آیا یک کاراکتر هگزادسیمال است یا خیر

کار با آرایه های کاراکتر

memchr - در آرایه حلقه بزنید تا اولین وقوع یک کاراکتر را پیدا کنید
memcmp - تعداد مشخصی از کاراکترها را در دو آرایه مقایسه می کند
memcpy - کاراکترها را از یک آرایه به آرایه دیگر کپی می کند
memmove - با در نظر گرفتن آرایه های همپوشانی، کاراکترها را از یک آرایه به آرایه دیگر کپی می کند
memset - تعداد مشخصی از کاراکترها را در یک آرایه با یک مشخصه پر می کند

دستکاری رشته

strcat - یک کپی از یک رشته را به رشته داده شده اضافه کنید
strchr - یک اشاره گر را به اولین رخداد بایت کم اهمیت پارامتر داده شده برمی گرداند.
strcmp - دو رشته را از نظر لغوی مقایسه می کند
strcoll - یک رشته را بر اساس setlocale با رشته دیگر مقایسه می کند
strcpy - محتویات یک رشته را در رشته دیگر کپی می کند
strcspn - رشته ای را بدون کاراکتر مشخص برمی گرداند
strerror - اشاره گر را به رشته حاوی پیام خطای سیستم برمی گرداند
strlen - طول یک رشته تهی را برمی‌گرداند

تصادفی نیست که موضوع رشته ها را در قسمت "آرایه ها" قرار دادم. از آنجایی که یک رشته در واقع آرایه ای از کاراکترها است. در اینجا یک مثال است:

char str = "این فقط یک رشته است";

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

char str = ("E"، "t"، "o"، ""، "p"، "p"، "o"، "s"، "t"، "o،"، "c"، "t"، "p"، "o"، "k"، "a")؛

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

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

  1. شما باید کلمه وارد شده را به حروف بزرگ تبدیل کنید:
  2. #عبارتند از
    #عبارتند از

    Int main ()
    {
    char str = "سرگئی";

    str [i] - = 32;
    }
    برای (int i = 0; str [i]! = "\ 0"; i ++) (
    printf ("% c"، str [i]);
    }
    گچ ();

    بازگشت 0؛
    }

    برای دریافت کد عددی، فقط از مشخص کننده % d در تابع printf استفاده کنید. بله، و یک نکته مهم دیگر: پایان هر رشته هاییک پایان دهنده تهی است که با کاراکتر ویژه "\ 0" نشان داده می شود.

راه دیگر برای تعیین رشته این است که آن را از طریق char * اعلام کنید. در اینجا یک مثال است:

char * str = "provod";

آن ها یک اشاره گر به یک رشته ایجاد می شود که در جایی در حافظه قرار دارد.

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

char str; scanf ("% s"، str);

دو نکته ظریف وجود دارد:

  1. علامت گرفتن آدرس در اینجا مورد نیاز نیست، زیرا نام آرایه همانطور که قبلاً می دانیم آدرس است
  2. طول رشته ورودی نباید از 15 کاراکتر تجاوز کند، زیرا آخرین کاراکتر باید پایان دهنده تهی باشد. علاوه بر این، خود کامپایلر این کاراکتر را بعد از آخرین کاراکتر وارد شده شما پر می کند.

از آنجایی که زبان C یک زبان ساخت یافته است، از قبل توابع داخلی برای آن وجود دارد کار با رشته هاو با نمادها برای پردازش رشته ها، باید فایلی را وارد کنید: ctype.h. فایل حاوی توابعی برای تعیین حروف، قالب کاراکتر است. اساساً، هر چیزی که باید در مورد یک نماد بدانید را می توان با استفاده از توابع موجود در فایل ctype.h انجام داد.

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

  1. int atoi (char * str)
  2. آتل بلند (char * str)
  3. آتوف دوبل (char * str)

گاهی اوقات این توابع بسیار مفید هستند، برای مثال، زمانی که نیاز دارید یک سال یا یک مقدار عددی را از یک رشته استخراج کنید. کار با رشته ها در c (s)موضوع بسیار مهمی است، بنابراین سعی کنید این درس را درک کنید.

آخرین به روز رسانی: 31.10.2015

الحاق

الحاق یا الحاق رشته ها را می توان با استفاده از عملیات + یا با استفاده از روش Concat انجام داد:

رشته s1 = "سلام"; string s2 = "world"; رشته s3 = s1 + "" + s2; // نتیجه: رشته "سلام جهان" رشته s4 = String.Concat (s3، "!!!"); // نتیجه: رشته "سلام دنیا!!!" Console.WriteLine (s4);

متد Concat یک متد استاتیک از کلاس String است که دو رشته را به عنوان پارامتر می گیرد. همچنین نسخه های دیگری از این روش وجود دارد که تعداد پارامترهای متفاوتی را می گیرند.

روش Join همچنین می تواند برای به هم پیوستن رشته ها استفاده شود:

رشته s5 = "سیب"; string s6 = "یک روز"; string s7 = "keeps"; string s8 = "یک پزشک"; string s9 = "دور"; مقادیر رشته = رشته جدید (s5، s6، s7، s8، s9)؛ String s10 = String.Join (""، مقادیر); // نتیجه: رشته "سیب در روز یک پزشک را دور نگه می دارد"

روش Join نیز ثابت است. نسخه روش استفاده شده در بالا دو پارامتر دریافت می کند: یک رشته جداکننده (در این مورد، یک فاصله) و یک آرایه از رشته ها که توسط یک جداکننده به هم متصل و از هم جدا می شوند.

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

روش مقایسه ایستا برای مقایسه رشته ها استفاده می شود:

رشته s1 = "سلام"; string s2 = "world"; int result = String.Compare (s1, s2); اگر (نتیجه<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) (Console.WriteLine ("خط s1 بعد از خط s2 می آید")؛ دیگری (Console.WriteLine ("خطوط s1 و s2 یکسان هستند")؛) // نتیجه "خط s1 قبل از خط s2" خواهد بود.

این نسخه از متد Compare دو رشته می گیرد و یک عدد را برمی گرداند. اگر سطر اول از نظر حروف الفبا بیشتر از خط دوم باشد، عددی کمتر از صفر برگردانده می شود. در غیر این صورت عددی بزرگتر از صفر برگردانده می شود. و مورد سوم - اگر رشته ها برابر باشند، عدد 0 برگردانده می شود.

در این حالت، از آنجایی که کاراکتر h بر اساس حروف الفبا بالاتر از کاراکتر w است، خط اول نیز بالاتر خواهد بود.

جستجو در رشته

با استفاده از روش IndexOf، می‌توانیم شاخص اولین وقوع یک کاراکتر یا زیررشته در یک رشته را تعیین کنیم:

String s1 = "سلام دنیا"; char ch = "o"; int indexOfChar = s1.IndexOf (ch); // برابر با 4 Console.WriteLine (indexOfChar); string subString = "wor"; int indexOfSubstring = s1.IndexOf (substring); // برابر با 6 Console.WriteLine (indexOfSubstring) است.

متد LastIndexOf به روشی مشابه کار می کند، فقط شاخص آخرین وقوع یک کاراکتر یا زیر رشته را در یک رشته پیدا می کند.

گروه دیگری از روش ها به شما امکان می دهد بفهمید که آیا یک رشته با یک زیررشته خاص شروع می شود یا به پایان می رسد. متدهای StartsWith و EndsWith برای این کار طراحی شده اند. به عنوان مثال، ما وظیفه داریم تمام فایل‌های دارای پسوند exe را از یک پوشه حذف کنیم:

مسیر رشته = @ "C: \ SomeDir"; فایل های رشته ای = Directory.GetFiles (مسیر); برای (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

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

با تابع Split می توانیم یک رشته را به آرایه ای از رشته های فرعی تقسیم کنیم. تابع Split به عنوان یک پارامتر، آرایه ای از کاراکترها یا رشته ها را می پذیرد که به عنوان جداکننده عمل می کنند. برای مثال، بیایید تعداد کلمات یک عبارت را با تقسیم آن بر فضای خالی بشماریم:

String text = "و به همین دلیل اینطوری شد"; string words = text.Split (نویسه جدید ("")); foreach (رشته در کلمات) (Console.WriteLine (ها)؛)

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

کلمات رشته = text.Split (نویسه جدید ("")، StringSplitOptions.RemoveEmptyEntries);

پارامتر دوم StringSplitOptions.RemoveEmptyEntries می گوید که همه زیر رشته های خالی حذف شوند.

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

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

متن رشته = "سلام دنیا"; text = text.Trim (); // نتیجه "سلام جهان" text = text.Trim (نویسه جدید ("d"، "h")); // نتیجه "ello worl"

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

این تابع مشابه های جزئی دارد: تابع TrimStart کاراکترهای شروع را برش می دهد و تابع TrimEnd کاراکترهای پایانی را برش می دهد.

تابع Substring به شما امکان می دهد قسمت خاصی از یک رشته را قطع کنید:

String text = "روز خوب"; // برش از کاراکتر سوم متن = text.Substring (2); // نتیجه "روز بخیر" Console.WriteLine (متن); // ابتدا به دو کاراکتر آخر برید text = text.Substring (0, text.Length - 2); // نتیجه "عزیز" Console.WriteLine (متن) است.

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

درج کنید

برای درج یک ردیف در ردیف دیگر، از تابع Insert استفاده کنید:

String text = "روز خوب"; string subString = "شگفت انگیز"; text = text.Insert (8, substring); Console.WriteLine (متن)؛

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

حذف ردیف ها

متد Remove به حذف بخشی از یک رشته کمک می کند:

String text = "روز خوب"; // فهرست آخرین کاراکتر int ind = text.Length - 1; // برش متن آخرین کاراکتر = text.Remove (ind); Console.WriteLine (متن)؛ // برش دو کاراکتر اول text = text.Remove (0, 2);

اولین نسخه از متد Remove یک فهرست در رشته می پذیرد که از آن همه کاراکترها حذف شود. نسخه دوم یک پارامتر دیگر را می پذیرد - تعداد کاراکترهایی که باید حذف شوند.

جایگزینی

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

String text = "روز خوب"; text = text.Replace ("خوب"، "بد"); Console.WriteLine (متن)؛ text = text.Replace ("درباره"، ""); Console.WriteLine (متن)؛

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

تغییر پرونده

برای تبدیل یک رشته به حروف بزرگ و کوچک، به ترتیب از توابع ToUpper () و ToLower () استفاده می شود:

رشته سلام = "سلام دنیا!"; Console.WriteLine (hello.ToLower ()); // سلام دنیا! Console.WriteLine (hello.ToUpper ()); // سلام دنیا!

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