Безпечні функції для роботи з рядками с. Введення та виведення символьних рядків у сі

п»їTrustworthy SEO Agency India Can Increase Revenues of Small Businesses

80% users search на Google і інші search engines перед тим, як purchase і більше 50% inquiries генерується через search engines get converted. Ці дві статистики випливають з важливості Search Engine Optimization. Там є багато таких статей і фактів, що робити clear point: будь-який маленький, мідний або великий простий бізнес потребує професійних SEO послуг. Малі businesses і startups often face budget issues. Вони можуть виявити будь-яке нестерпне SEO SEO агентства від Індії, щоб отримати велику SEO послуг у своєму бюджеті, щоб збільшити свої покарання.
Search holds a great impact on consumers' minds. З огляду на різні статуї shared by major search engine optimization experts on divers authorized website such as Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot, etc. SEO captures majority of the leads. Also, leads coming from the organic search results have higher conversion rate. Ці статки і consumer behavior Make clearer point that best SEO service is not luxury, but a necesity for any business.
Щобперейти до конкуренції і збільшення бізнесу зростає їх організація потребує використання Search Engine Optimization Services. Великі бригади можуть вносити гроші в провідні SEO послуги, що знаходяться в верхньому SEO компанії або SEO specialist, але малого бізнесу власників намагаються відповісти на якість цього сервісу до найменшого бюджету. Це досить значний факт малого бізнесу і startups end up leaving the opportunities, які можуть бути створені з професійним SEO service або використовувати cheap SEO service, які мають не позитивні результати.
Невеликі business owners і startups можуть отримати прибутки професійних SEO послуги навіть в обмеженому бюджеті. The best solution is finding a trustworthy SEO company based out of India. В Індії, є багато SEO фахівців, які працюють з цифровим маркетинговим агентством і забезпечать велику індустрію послуг. Вони можуть забезпечити вам необхідні SEO послуги в своєму бюджеті. Засоби можуть бути невідомі з SEO агентства India до того, щоб отримати послуги на низьких rates. However, Дон'т fall for cheap SEO service, що зменшує ганебні і загрожує, щоб зробити більше, як експертизи, які робили на свій власний капітал. Ви повинні повідомити portfolio або поставити загальні питання перед тим, як затвердити company for your business.
SEO experts в Індії є skilled with best practices search engine optimization. Також, є деякі SEO specialists в India так само як Ash Vyas, які спеціально в створенні кращого search engine optimization strategy for business in stated budget. The SEO profesionales буде створювати чіткий план і буде також share what can be the expected results. Це означає, що може бути приємною мірою для вашого investment and returns. Це helps in making a better business decision.
A good idea є find and contract trustworthy SEO company from India, що offers best SEO послуги як soonest as possible. Ви можете також запустити з маленьким бюджетом і обмеженими діями до запуску отримання ваших WebPages indexed and boosting ваші ключові слова в пошукових інструментах. Don't wait for perfect time or a day when you will have thousands dollars to invest in the best SEO services. Starting early will help you get quicker results when you can go aggressive with your marketing approach. Наскільки брудним SEO компанія заснована на Індії, щоб допомогти вам визначити ваші поточні і майбутні плани на сприятливі результати. Більше indexed pages boosted rankings і credible brand of your business made with continuous professional SEO practices will double inquiries, business, and revenues. Будь-який малий бізнес може запустити з двома digit investment в професійних SEO послуг. Є багато SEO агенцій в Індії, які мають низький бюджет є результат від oriented Search Engine Optimization services.

surveys from exile

  • CraigWew

    12.04.2018

    п'їThe Importance of Establishing Rapport With the Customer в Real Estate and General Sales

    Важливість встановлення rapport with customer.
    Розміщення rapport with customer has to earned and must be approached as very integral part of the sales process.
    У повідомленні, щоб отримати customers and yourself to relate on real one to one basis, involves two things!
    Перший, ви будете думати і бути! Second you must understand that there are two different stages that will occur during this process.
    A-Be there-what does that mean?
    o Most people don’t really listen to another person as they talk. Generally they are so busy formulating their next answer or statement that they couldn't possibly really listen.
    o If this sounds like you, being there means shut up and listen!
    B-What is the first or initial stage?
    o General you have just a few minutes to establish yourself in the customers mind as someone they want to deal with.
    o Коли в цій справі є кращим до перших запитань, що будуть витягнути їх звідти і говорити про нихсам.
    o It is also always safe to appear as a professional-I don't mean stoic or dry, but someone who knows what they are doing and talks and looks the part.
    C-Other stages
    o Як time goes on, through conversation and questions they will have, you will either establish your ability or not.
    o Be aware that they will probably be measuring you for a while. Хороші новини є, що на деякий час, якщо ви повинні бути успішним при встановленні rapport-they буде relax і ви можете бути concentrate on finding або selling the home.
    What else can help me develop rapport?
    o By trying до understand різних типів типів і вони беруть до себе і asking the right questions.
    o Якщо ви маєте гарний rapport (використовувати на тій самій воді, як покупець), то selling є basically over, now it’s just matter of finding the right home or filling out the listing papers.
    What about different personalities
    o Since this is not a book on psychiatry, для котрих є just understand два main types.
    o Там є занедбані і викинуті люди.
    o You know the type. Подумайте про трьох людей, які знають, що fit їх класифікація.
    What sobre body Language and speech patterns?
    o Якщо вони розмовляють швидко або повільно, намагаємося помітити свої частоти.
    o If they talk loud або soft, do the same. Чи є вони підписання або backward?
    o Needless to say, є багато книг, що написані на цьому предметі. Just be aware that it is important factor-especially when you're setting in conference room or at someone's home discussing a $400,000 deal.
    Розвиток rapport is a skill that can be learned and improved upon.
    o Все, що я маю змогу зробити salesson, що я можу скористатися і їсти, щоб бути приємним. The reason is he or she, зробили ви нестерпним комфортом до де ви trusted them.
    How do we develop rapport?
    o Use your eyes and ears and ask questions. To explain
    o Use the eyes:
    o Look at their dress-their car-their індивідуальні поssessions and I mean really look at them and decipher what that tells you about them.
    o Use the ears:
    o Потрібно, щоб вони могли і вирішити питання для того, щоб отримати з їхньої реальної зміни!
    Тепер під час всіх цих речей, вони будуть, можливо, один або два теми, які ви знаєте, що ви маєте в одному з ним. (Family, geographical areas, fishing, etc) Коли ви збираєтеся як загальний персонал, згодом вони знають вашу familiarity і будуть братися до хвилини до розмови з ним.
    What is the Goal?
    o Once they accept you as one of them you're in position to really have a great experience in the sale as you're now working together then as a team-you're no longer the salesman you're now in an advisory position .
    o Remember, the customer either will or will not allow you to enter his world. Якщо ви думаєте про це і реально працює hard to become empathetic with him/her, you can gain a position of trust. In most cases, you will actually see them relax (body language) when this happens you’re on the way.
    o To illustrate this have you ever given speech and noticed that as you finally connected with audience member they will nod in approval. Theth things може all seem trite but they aren’t.
    У closing, якщо ви можете їсти customers trust, selling aproduct or service is much easier and experience can be enoyable for everyone involved.
    Будь-який remember що Win/Win є best situion.

Рядки. Введення-виведення рядків. Форматоване введення-виведення. Обробка рядків із використанням стандартних функцій мови С. Робота з пам'яттю.

1.1. Оголошення та ініціалізація рядків.

Рядком називається масив символів, який закінчується порожнім символом '\0'. Рядок оголошується як звичайний символьний масив, наприклад,

char s1; // рядок завдовжки дев'ять символів

char * s2; // покажчик на рядок

Відмінність між покажчиками s1 і s2 у тому, що покажчик s1 є іменованою константою, а покажчик s2 – змінної.

Рядкові константи полягають у подвійні лапки на відміну від символів, які полягають у одинарних лапках. Наприклад,

"This is a string."

Довжина строкової константи не може перевищувати 509 символів за стандартом. Однак, багато реалізації допускають рядки більшої довжини.

При ініціалізації рядків розмірність масиву краще не вказувати, це виконає компілятор, підрахувавши довжину рядка та додавши до нього одиницю. Наприклад,

char s1 = "This is a string.";

У мові програмування для роботи з рядками існує велика кількість функцій, прототипи яких описані в заголовних файлах stdlib.h і string.h. Робота з цими функціями буде розглянута у наступних параграфах.

1.2. Введення-виведення рядків.

Для введення рядка з консолі служить функція

char * gets (char * str);

яка записує рядок на адресу str і повертає адресу введеного рядка. Функція припиняє введення, якщо зустріне символ '\n' або EOF (кінець файлу). Символ переходу до нового рядка не копіюється. У кінець прочитаного рядка міститься нульовий байт. У разі успіху функція повертає покажчик на прочитаний рядок, а у разі невдачі NULL.

Для виведення рядка на консоль служить стандартна функція

int puts (const char * s);

яка у разі удачі повертає невід'ємне число, а у разі невдачі – EOF.

Прототипи функцій gets і puts описані в заголовку stdio.h.

#include

printf("Input String:");

1.3. Форматоване введення-виведення.

Для форматованого введення даних із консолі використовується функція

int scanf (const char * format, …);

яка у разі успішного завершення повертає кількість одиниць прочитаних даних, а у разі невдачі – EOF. Параметр format повинен вказувати на рядок, що форматується, який містить специфікації форматів введення. Кількість та типи аргументів, які випливають після рядка форматування, повинні відповідати кількості та типам форматів введення, заданим у рядку форматування. Якщо ця умова не виконується, то результат роботи функції непередбачуваний.

Пробіл, символи \t або \n у форматному рядку описують один або більше порожніх символів у вхідному потоці, до яких належать символи: пробіл, '\t', '\n', '\v', '\f '. Функція scanf пропускає порожні символи у вхідному потоці.

Літеральні символи у форматному рядку, за винятком символу %, вимагають, щоб у вхідному потоці з'явилися такі самі символи. Якщо такого символу немає, функція scanf припиняє введення. Функція scanf пропускає літеральні символи.

У загальному випадку специфікація формату введення має вигляд:

%[*] [ширина] [модифікатори] тип

Символ '*' позначає перепустку при введенні поля, визначеного даною специфікацією;

- 'ширина' визначає максимальну кількість символів, що вводяться за даною специфікацією;

Тип може приймати такі значення:

c – символьний масив,

s – рядок символів, рядки поділяються порожніми символами,

d – ціле число зі знаком 10 с/c,

i – ціле число зі знаком, система числення залежить від двох перших цифр,

u – ціле число без знака 10 с/с,

o – ціле число без знака 8 с/c,

х, Х – ціле число без знака 16 с/с,

e, E, f, g, G – плаваюче число,

p - покажчик на покажчик,

n - покажчик на ціле,

[…] – масив символів, що скануються, наприклад, .

В останньому випадку із вхідного потоку вводитимуться лише символи, укладені у квадратні дужки. Якщо перший символ усередині квадратних дужок дорівнює ^, то вводяться тільки ті символи, які не входять в масив. Діапазон символів у масиві визначається через символ '-'. При введенні символів провідні порожні символи та завершальний нульовий байт рядка також вводяться.

Модифікатори можуть приймати такі значення:

h – коротке ціле,

l, L – довге ціле або плаваюче,

і використовуються тільки для цілих чи плаваючих чисел.

У наступному прикладі показано варіанти використання функції scanf. Зверніть увагу, що перед специфікатором формату, починаючи з введення плаваючого числа, стоїть символ пропуску.

#include

printf("Input an integer: ");

scanf("%d", &n);

printf("Input a double: ");

scanf("%lf", &d);

printf("Input a char:");

scanf("%c", &c);

printf("Input a string:");

scanf("%s", &s);

Зверніть увагу, що в цій програмі число з точкою, що плаває, проініціалізоване. Це зроблено для того, щоб компілятор підключив бібліотеку для підтримки роботи з плаваючими числами. Якщо цього зробити, то етапі виконання під час введення плаваючого числа відбудеться помилка.

Для форматованого виведення даних на консоль використовується функція

int printf (const char * format, …);

яка у разі успішного завершення повертає кількість одиниць виведених даних, а у разі невдачі – EOF. Параметр format є форматованим рядком, який містить специфікації форматів виведення. Кількість та типи аргументів, які випливають після рядка форматування, повинні відповідати кількості та типам специфікацій формату виведення, заданим у рядку форматування. У випадку специфікація формату виведення має вид:

%[прапори] [ширина] [.точність] [модифікатори] тип

- 'прапори' – це різні символи, що уточнюють формат виведення;

- 'ширина' визначає мінімальну кількість символів, що виводяться за даною специфікацією;

- '.точність' визначає максимальну кількість символів, що виводяться;

- 'модифікатори' уточнюють тип аргументів;

- 'тип' визначає тип аргументу.

Для виведення цілих чисел зі знаком використовується наступний формат виводу:

%[-] [+ | пробіл] [ширина] [l] d

- вирівнювання вліво, за замовчуванням - вправо;

+ – виводиться знак '+', зауважимо, що з негативних чисел завжди виводиться знак '-';

'пробіл' – у позиції знака виводиться пробіл;

d – тип даних int.

Для виведення цілих чисел без знака використовується наступний формат:

%[-] [#] [ширина] [l]

# – виводиться початковий 0 для чисел 8 c/c або початкові 0x або 0X для чисел 16 c/c,

l – модифікатор типу даних long;

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. Наприклад,

#include

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

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

printf("%c\n", c); // друкує: a

printf("%d\n", n); // друкує: 10

printf("%f\n", d); // друкує: 1.200000

printf("%s\n", s); // друкує: String

int sprintf (char buffer, const char format, …);

форматує рядок відповідно до формату, який заданий параметром format і записує отриманий результат символьний масив buffer. Повертає функція кількість символів, записаних у символьному масиві buffer, виключаючи завершальний нульовий байт. Наприклад,

#include

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

char s = "This is a string.";

sprintf(buffer, str, c, n, d, s);

printf("%s\n", buffer); // друкує: c = c, n = 10, d = 1.200000, s = This is a string

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

Для перетворення рядка на тип double використовується функція

double atof (const char * str);

яка у разі успішного завершення повертає плаваюче число типу double, у яке перетворено рядок str, а у разі – невдачі 0. Наприклад,

char * str = "-123.321";

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

Наступні функції виконують дії, аналогічні до функцій atoi, atol, atof, але надають ширші можливості.

long int strtol (const char str, char endptr, int base);

перетворює рядок str на число типу long int, яке і повертає. Параметри цієї функції мають наступне призначення.

Якщо аргумент base дорівнює 0, перетворення залежить від перших двох символів рядка str:

Якщо перший символ – цифра від 1 до 9, передбачається, що число представлено 10 c/c;

Якщо перший символ – цифра 0, а другий – цифра від 1 до 7, передбачається, що число представлено 8 c/c;

Якщо перший символ 0, а другий - 'Х' або 'х', то передбачається, що число представлене 16 c/c.

Якщо аргумент base дорівнює числу від 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, stop = a

n = strtol (“012b”, &p, 0);

printf (“n=%ld, %stop=%c, n, *p); // n = 10, stop = b

n = strtol (“0x12z”, &p, 0);

printf (“n=%ld, %stop=%c, n, *p); // n = 18, stop = z

n = strtol (“01117”, &p, 0);

printf (“n=%ld, %stop=%c, n, *p); // n = 7, stop = 7

unsigned long int strtol (const char str, char endptr, int base);

працює аналогічно функції strtol, але перетворює символьне уявлення числа на число типу unsigned long int.

double strtod (const char str, char endptr);

перетворює символьне уявлення числа на число типу double.

Всі функції, перелічені в цьому параграфі, припиняють свою роботу при зустрічі першого символу, який не підходить під формат числа, що розглядається.

Крім того, якщо символьне значення числа перевищує діапазон допустимих значень для відповідного типу даних, то функції 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 та повертає –1, 0 або 1, якщо рядок str1 відповідно менший, дорівнює або більше рядка str2.

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

лексикографічно порівнює лише n перших символів з рядків str1 і str2. Функція повертає –1, 0 або 1, якщо перші n символи з рядка str1 відповідно менші, рівні або більше перших n символів з рядка str2.

// приклад порівняння рядків

#include

#include

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 = "Copy string.";

strcpy (str1, str2);

printf (str1); // Друкує: Copy string.

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.

#include

#include

char str1 = "String";

char str2 = "catenation";

char str3 = "Yes No";

strcat (str1, str2);

printf ("%s\n", str1); // друкує: String catenation

strncat (str1, str3, 3);

printf ("%s\n", str1); // друкує: String catenation Yes

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.

#include

#include

char str = "Char search";

printf ("%s\n", strchr (str, "r")); // друкує: r search

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. Розбір рядка на лексеми.Для аналізу рядка на лексеми використовується функція strtok.

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

повертає покажчик на наступну лексему (слово) у рядку str1, де роздільниками лексем є символи з рядка str2. Якщо лексеми закінчилися, то функція повертає NULL. При першому виклику функції strtok параметр str1 повинен вказувати на рядок, який розбирається на лексеми, а при наступних викликах цей параметр має бути встановлений у NULL. Після знаходження лексеми функція strtok записує після цієї лексеми на місце роздільника нульовий байт.

#include

#include

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++ визначено клас із функціями та властивостями (змінними) для організації роботи з рядками (у класичній мові C рядків як таких немає, є лише масиви символів char):

#include

#include

#include

Для роботи з рядками також необхідно підключити стандартний namespace:

За допомогою namespace std;

А якщо ні, то доведеться скрізь вказувати описник класу std::string замість string .

Нижче наводиться приклад програми, що працює зі string (у старих сі-сумісних компіляторах не працює!):

#include #include #include using namespace std; int main () (string s = "Test"; s.insert (1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->erase(s2->end()); cout<< s2->c_str(); cin.get(); return 0; )

Основні можливості, які має клас string:

  • ініціалізація масивом символів (рядком вбудованого типу) чи іншим об'єктом типу string . Вбудований тип не має другої можливості;
  • копіювання одного рядка до іншого. Для вбудованого типу доводиться використовувати функцію strcpy();
  • доступ до окремих символів рядка для читання та запису. У вбудованому масиві при цьому застосовується операція взяття індексу чи непряма адресація з допомогою покажчика;
  • порівняння двох рядків на рівність. Для вбудованого типу використовують функції сімейства strcmp() ;
  • конкатенація (зчеплення) двох рядків, що дає результат або як третій рядок, або замість одного з вихідних. Для вбудованого типу використовується функція strcat() , проте щоб отримати результат у новому рядку, необхідно послідовно задіяти функції strcpy() і strcat() , а також подбати про виділення пам'яті;
  • вбудовані засоби визначення довжини рядка (функції-члени класу size() та l ength()). Дізнатися довжину рядка вбудованого типу можна лише обчисленням за допомогою функції strlen();
  • можливість дізнатися, чи порожній рядок.

Розглянемо ці базові можливості докладніше.

Ініціалізація рядківпри описі та довжина рядка(не включаючи завершальний нуль-термінатор):

String st("Мій рядок\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";

Рядок може бути заданий і порожній:

String st2;

Для перевірки того, чи порожній рядок, Можна порівняти її довжину з 0:

If (! st.size()) // Порожня

або застосувати метод empty() , який повертає true для порожнього рядка і false для непустого:

If (st.empty()) // Порожня

Третя форма створення рядка ініціалізує об'єкт типу string іншим об'єктом того ж типу:

String st3(st);

Рядок st3 ініціалізується рядком st. Як ми можемо переконатися, що ці рядки збігаються? Скористайтеся оператором порівняння (==):

If (st == st3) // ініціалізація спрацювала

Як скопіювати один рядок в інший? За допомогою звичайної операції присвоєння:

St2 = st3; // Копіюємо st3 в st2

Для зчеплення рядківвикористовується операція додавання (+) або операція додавання з присвоєнням (+=). Нехай дано два рядки:

String s1("hello,"); string s2("world\n");

Ми можемо отримати третій рядок, що складається з конкатенації перших двох, таким чином:

String s3 = s1 + s2;

Якщо ми хочемо додати s2 в кінець s1 , ми повинні написати:

S1 + = s2;

Операція додавання може зчеплювати об'єкти класу stringяк між собою, а й з рядками вбудованого типу. Можна переписати приклад, наведений вище, так, щоб спеціальні символи та розділові знаки представлялися вбудованим типом char * , а значущі слова - об'єктами класу string:

Const char * pc = ","; string s1("hello"); string s2("world"); string s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;

Подібні висловлювання працюють тому, що компілятор "знає", як автоматично перетворювати об'єкти вбудованого типу на об'єкти класу string . Можливе і просте привласнення вбудованого рядка об'єкту string:

String s1; const char * pc = "a character array"; s1 = pc; // правильно

Зворотне перетворення у своїй не працює. Спроба виконати наступну ініціалізацію рядка вбудованого типу викликає помилку компіляції:

Char str = s1; // помилка компіляції

Щоб здійснити таке перетворення, необхідно явно викликати функцію-член з назвою c_str() ("рядок Сі"):

Const char * str = s1.c_str ();

Функція c_str() повертає покажчик на символьний масив, що містить рядок об'єкта string у тому вигляді, в якому вона перебувала у вбудованому рядковому типі. Ключове слово const тут запобігає "небезпечній" у сучасних візуальних середовищах можливість безпосередньої модифікації вмісту об'єкта через покажчик.

До окремим символамоб'єкта типу string , як і вбудованого типу, можна звертатися за допомогою операції взяття індексу. Ось, наприклад, фрагмент коду, який замінює всі крапки символами підкреслення:

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

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

Щоправда, тут використано не метод replace класу string , а однойменний алгоритм:

#include

Оскільки об'єкт string поводиться як контейнер, до нього можуть застосовуватися інші алгоритми. Це дозволяє вирішувати задачі, які не вирішуються безпосередньо функціями класу string .

Нижче наводиться короткий опис основних операторів та функцій класу string, посилання в таблиці ведуть до російськомовних описів в Інтернеті. Більш повний список можливостей класу string можна отримати, наприклад у Вікіпедії або на сайті cplusplus.com .

Завдання символів у рядку

operator=

надає значення рядку

assign

призначає символи рядку

Доступ до окремих символів

at

отримання вказаного символу з перевіркою виходу індексу за кордон

operator

отримання вказаного символу

front

отримання першого символу

back

отримання останнього символу

data

повертає покажчик на перший символ рядка

c_str

повертає немодифікованиймасив символів С , що містить символи рядка

Перевірка на місткість рядка

empty

перевіряє, чи є рядок порожнім

size
length

повертає кількість символів у рядку

max_size

повертає максимальну кількість символів

reserve

резервує місце для зберігання

Операції над рядком

clear

очищує вміст рядка

insert

вставка символів

erase

видалення символів

push_back

додавання символу до кінця рядка

pop_back

видаляє останній символ

append

operator+=

додає символи до кінця рядка

compare

порівнює два рядки

replace

замінює кожне входження вказаного символу

substr

повертає підрядок

copy

копіює символи

resize

змінює кількість збережених символів

Оголошення рядків

Рядок у мові Сі є одновимірним масивом символів, останнім елементом якого є символ кінця рядка – нуль (рядок, що завершується нулем, тобто NULL terminated string).

Оголошення змінної типу рядок у мові Сі можливе трьома способами, два з яких ініціалізують рядок під час оголошення.

Перший спосіб:

Оголошення масиву символів (не забудьте додати місце для завершального нуля):

Char s;

Другий спосіб:

Присвоїти рядковій змінній початкове значення (при цьому довжину рядка компілятор може обчислити сам):

Char s = "Приклад ініціалізації рядка";

Праворуч від знака присвоювання записано рядкову константу. Наприкінці рядка автоматично додається нуль ('\0'). Константи символьних рядків поміщаються до класу статичної пам'яті.

Третій спосіб:

Неявна вказівка, що масив використовується. У лівій частині від знака присвоювання вказується вказівник на символ:

Char * s = "Другий варіант ініціалізації";

Змінна s буде покажчиком те місце у оперативної пам'яті, де розташовується рядкова константа. У такій формі запису криється потенційна помилка, яка полягає в тому, що вказівник на символ часто називають рядком. Поданий нижче запис – це лише вказівник на символ, оскільки для розміщення рядка місце не передбачено:

Char * s;

Введення рядка зі стандартного пристрою введення (клавіатури)

Для роботи із рядками є набір функцій. Для введення зі стандартного пристрою введення (клавіатури) найчастіше використовуються бібліотечні функціями з модуля стандартного вводу-виводу: scanfі gets.

Для введення рядка за допомогою функції scanf, використовує формат « %s» , причому зверніть увагу на те, що перед ідентифікатором рядка не використовується знак адреси « & » , оскільки одномірний масив вже представлений покажчиком з його початок:

Scanf("%s", s);

Функція gets()зчитує символи, доки не досягне символу переходу на новий рядок. Функція приймає всі символи до символу перекладу рядка, але не включає його. До кінця рядка додається завершальний нуль ('\0'). Функція gets()поміщає зчитану з клавіатури послідовність символів параметр типу рядок і повертає покажчик на цей рядок (якщо операція завершилася успішно), або NULL (у разі помилки). У наведеному нижче прикладі при успішному завершенні операції на екран буде виведено два однакові рядки:

#include int main() ( char s; char *p; p=gets(s); printf(" \n Введений рядок %s. ",s); if (p) printf(" \n Введений рядок %s. ", p); return 0;

Принагідно зауважимо, що функція gets часто використовується для введення будь-яких даних з клавіатури у вигляді рядка з метою подальшого перетворення функцією sscanf до потрібного формату або для попереднього аналізу даних, що вводяться, наприклад:

#include #include #include 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); return 0; )

Виведення рядків на стандартний пристрій виведення (екран монітора)

Для виведення рядків на стандартний пристрій виводу (екран монітора) можна використовувати дві функції printfі puts. У функції printf як формат передається «%s». Зручність використання цієї функції полягає в тому, що, крім рядка, можна відразу виводити дані інших типів. Особливість функції putsполягає в тому, що після виведення рядка автоматично відбувається перехід на наступний рядок.

Функції для роботи з рядками

Для перетворення рядків у мові Сі передбачено бібліотеку string. Кожна з функцій має формат запису (прототип).

Найбільш використовувані функції розглянуті у цій статті. - читати

Приклад програм (листинг), що працює з рядками

34

--- Посібник з C# --- Рядки

З погляду регулярного програмування рядковий тип даних stringналежить до найважливіших в C#. Цей тип визначає та підтримує символьні рядки. У низці інших мов програмування рядок є масив символів. На C# рядки є об'єктами. Отже, тип string належить до посилальних.

Побудова рядків

Найпростіший спосіб побудувати символьний рядок - скористатися рядковим літералом. Наприклад, у наступному рядку коду змінного посилання на рядок str надається посилання на рядковий літерал:

String str = "Приклад рядка";

У цьому випадку змінна str ініціалізується послідовністю символів "Приклад рядка". Об'єкт типу string можна створити з масиву типу char. Наприклад:

Char chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = новий string (chararray);

Як тільки об'єкт типу string буде створений, його можна використовувати скрізь, де тільки потрібно рядок тексту, укладеного в лапки.

Постійність рядків

Як не дивно, вміст об'єкта типу string не змінюється. Це означає, що одного разу створену послідовність символів не можна змінити. Але це обмеження сприяє більш ефективної реалізації символьних рядків. Тому цей, на перший погляд, очевидний недолік насправді перетворюється на перевагу. Так, якщо потрібен рядок як різновид вже наявного рядка, то для цієї мети слід створити новий рядок, що містить усі необхідні зміни. А оскільки рядкові об'єкти, що не використовуються, автоматично збираються в "сміття", то про подальшу долю непотрібних рядків можна навіть не турбуватися.

Слід, однак, підкреслити, що змінні посилання рядки (тобто об'єкти типу string) підлягають зміні, отже, можуть посилатися інший об'єкт. Але вміст самого об'єкта типу string не змінюється після створення.

Розглянемо приклад:

Static void addNewString() ( string s = "This is my stroke"; s = "This is new stroke"; )

Скомпілюємо додаток і завантажимо результуючу збірку в утиліту ildasm.exe. На малюнку показано CIL-код, який буде згенерований для методу void addNewString():

Зверніть увагу на наявність численних дзвінків коду операції ldstr (завантаження рядка). Цей код операції ldstr у CIL передбачає виконання завантаження нового об'єкта string у керовану купу. В результаті попередній об'єкт, в якому містилося значення This is my stroke, буде в кінцевому підсумку видалено збирачем сміття.

Робота з рядками

В класі System.Stringнадається набір методів для визначення довжини символьних даних, пошуку підрядки в поточному рядку, перетворення символів з верхнього регістру на нижній і навпаки, і т.д. Далі ми розглянемо цей клас докладніше.

Поле, індексатор та властивість класу String

У класі String визначено єдине поле:

Public static readonly string Empty;

Поле Empty означає порожній рядок, тобто. такий рядок, який не містить символів. Цим воно відрізняється від порожнього посилання типу String, яке просто робиться на неіснуючий об'єкт.

Крім цього, у класі String визначено єдиний індексатор, доступний тільки для читання:

Public char this (get;)

Цей індексатор дозволяє отримати символ за вказаним індексом. Індексація рядків, як і масивів, починається з нуля. Об'єкти типу String відрізняються сталістю і змінюються, тому цілком логічно, що у класі String підтримується індексатор, доступний лише читання.

І нарешті, у класі String визначено єдину властивість, доступну тільки для читання:

Public int Length ( get; )

Властивість Length повертає кількість символів у рядку. У прикладі нижче показано використання індексатора та властивості Length:

Using System; class Example ( static void Main() ( string str = "Простий рядок"; // Отримати довжину рядка і 6й символ у рядку використовуючи індексатор Console.WriteLine("Довжина рядка - (0), 6й символ - "(1)"") , str.Length, str); ) )

Оператори класу String

У класі String перевантажуються два наступні оператори: == і!=. Оператор == служить для перевірки двох символьних рядків на рівність. Коли оператор == застосовується до посилань на об'єкти, він зазвичай перевіряє, чи робляться обидві посилання однією і той самий об'єкт. А коли оператор == застосовується до посилань на об'єкти типу String, то щодо рівності порівнюється вміст самих рядків. Це саме стосується і оператора!=. Коли він застосовується до посилань на об'єкти типу String, то щодо нерівності порівнюється вміст самих рядків. У той самий час інші оператори відносини, зокрема =, порівнюють посилання об'єкти типу String так само, як і інших типів. А для того щоб перевірити, чи є один рядок більше за інший, слід викликати метод Compare(), визначений у класі String.

Як стане ясно далі, у багатьох видах порівняння символьних рядків використовуються відомості про культурне середовище. Але це не стосується операторів == і!=. Адже вони просто порівнюють порядкові значення символів у рядках. (Іншими словами, вони порівнюють двійкові значення символів, які не видозмінені нормами культурного середовища, тобто регіональними стандартами.) Отже, ці оператори виконують порівняння рядків без урахування регістру та налаштувань культурного середовища.

Методи класу String

У наступній таблиці перераховані деякі найцікавіші методи цього класу, згруповані за призначенням:

Методи роботи з рядками
Метод Структура та перевантажені версії Призначення
Порівняння рядків
Compare() public static int Compare(string strA, string strB)

Public static int Compare(string strA, string strB, bool ignoreCase)

Public static int Compare(string strA, string strB, StringComparison comparisonType)

Public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo culture)

Статичний метод порівнює рядок strA з рядком strB. Повертає позитивне значення, якщо рядок strA більший за рядок strB; негативне значення, якщо рядок strA менший за рядок strB; і нуль, якщо рядки strA та strB рівні. Порівняння виконується з урахуванням регістру та культурного середовища.

Якщо параметр ignoreCase набуває логічного значення true, то при порівнянні не враховуються відмінності між великим і малим варіантами букв. В іншому випадку ці відмінності враховуються.

Параметр comparisonType визначає конкретний спосіб порівняння рядків. Клас CultureInfo визначений у просторі імен System.Globalization.

public static int Compare(string strA, int indexA, string strB, int indexB, int length)

Public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase)

Public static int Compare(string strA, int indexA, string strB, int indexB, int length, StringComparison comparisonType)

Public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo culture)

Порівнює частини рядків strA та strB. Порівняння починається з рядкових елементів strA та strB і включає кількість символів, що визначаються параметром length. Метод повертає позитивне значення, якщо частина рядка strA більша за частину рядка strB; негативне значення, якщо частина рядка strA менша від частини рядка strB; і нуль, якщо порівнювані частини рядків strA та strB рівні. Порівняння виконується з урахуванням регістру та культурного середовища.

CompareOrdinal() public static int CompareOrdinal(string strA, string strB)

Public static int CompareOrdinal(string strA, int indexA, string strB, int indexB, int count)

Робить те саме, що метод Compare(), але не враховуючи локальних установок

CompareTo() public int CompareTo(object value)

Порівнює рядок з рядковим поданням об'єкта value. Повертає позитивне значення, якщо рядок, що викликає, більший за рядок value; негативне значення, якщо рядок, що викликає, менше рядка value; і нуль, якщо порівнювані рядки дорівнюють

public int CompareTo(string strB)

Порівнює рядок з рядком strB

Equals() public override bool Equals(object obj)

Повертає логічне значення true, якщо рядок, що викликає, містить ту ж послідовність символів, що і рядкове представлення об'єкта obj. Виконується порядкове порівняння з урахуванням регістру, але не враховуючи культурного середовища

public bool Equals(string value)

Public bool Equals(string value, StringComparison comparisonType)

Повертає логічне значення true, якщо рядок, що викликає, містить ту ж послідовність символів, що і рядок value. Виконується порядкове порівняння з урахуванням регістру, але не враховуючи культурного середовища. Параметр comparisonType визначає конкретний спосіб порівняння рядків

public static bool Equals(string a, string b)

Public static bool Equals(string a, string b, StringComparison comparisonType)

Повертає логічне значення true, якщо рядок містить таку ж послідовність символів, що і рядок b . Виконується порядкове порівняння з урахуванням регістру, але не враховуючи культурного середовища. Параметр comparisonType визначає конкретний спосіб порівняння рядків

Конкатенація (з'єднання) рядків
Concat() public static string Concat(string str0, string str1);

public static string Concat(params string values);

Комбінує окремі екземпляри рядків в один рядок (конкатенація)
Пошук у рядку
Contains() public bool Contains(string value) Метод, який дозволяє визначити, чи міститься у рядку певний підрядок (value)
StartsWith() public bool StartsWith(string value)

Public bool StartsWith(string value, StringComparison comparisonType)

Повертає логічне значення true, якщо рядок, що викликає, починається з підрядка value. В іншому випадку повертається логічне значення false. Параметр comparisonType визначає конкретний спосіб пошуку

EndsWith() public bool EndsWith(string value)

Public bool EndsWith(string value, StringComparison comparisonType)

Повертає логічне значення true, якщо рядок, що викликає, закінчується підрядком value. В іншому випадку повертає логічне значення false. Параметр comparisonType визначає конкретний спосіб пошуку

IndexOf() public int IndexOf(char value)

Public int IndexOf(string value)

Знаходить перше входження заданого підрядка або символу в рядку. Якщо символ або підрядок не виявлено, то повертається значення -1

public int IndexOf(char value, int startIndex)

Public int IndexOf(string value, int startIndex)

Public int IndexOf(char value, int startIndex, int count)

Public int IndexOf(string value, int startIndex, int count)

Повертає індекс першого входження символу або підрядка value в рядку, що викликає. Пошук починається з елемента, що вказується за індексом startIndex, і охоплює кількість елементів, що визначаються параметром count (якщо вказано). Метод повертає значення -1, якщо шуканий символ або підрядок не виявлено

LastIndexOf() Перевантажені версії аналогічні методу IndexOf()

Те ж, що IndexOf, але знаходить останнє входження символу або підрядка, а не перше

IndexOfAny() public int IndexOfAny(char anyOf)

Public int IndexOfAny(char anyOf, int startIndex)

Public int IndexOfAny(char anyOf, int startIndex, int count)

Повертає індекс першого входження будь-якого символу з масиву anyOf, виявленого в рядку, що викликає. Пошук починається з елемента, що вказується за індексом startIndex, і охоплює кількість елементів, що визначаються параметром count (якщо вони вказані). Метод повертає значення -1, якщо не виявлено збігу ні з одним із символів з масиву anyOf. Пошук здійснюється порядковим способом

LastIndexOfAny Перевантажені версії аналогічні методу IndexOfAny()

Повертає індекс останнього входження будь-якого символу з масиву anyOf, виявленого в рядку, що викликає.

Поділ та з'єднання рядків
Split public string Split(params char separator)

Public string Split(params char separator, int count)

Метод, що повертає масив string з присутніми в даному екземплярі підрядками всередині, які відокремлюються один від одного елементами зазначеного масиву char або string.

У першій формі методу Split() рядок, що викликає, поділяється на складові частини. У результаті повертається масив, що містить підрядки, отримані з рядка, що викликає. Символи, що обмежують ці підрядки, передаються у масиві separator. Якщо масив separator порожній або посилається на порожній рядок, то як роздільник підрядків використовується пробіл. А у другій формі даного методу повертається кількість підрядків, що визначаються параметром count.

public string Split(params char separator, StringSplitOptions options)

Public string Split(string separator, StringSplitOptions options)

Public string Split(params char separator, int count, StringSplitOptions options)

Public string Split(string separator, int count, StringSplitOptions options)

У двох перших формах методу Split() викликає рядок поділяється на частини і повертається масив, що містить підрядки, отримані з рядка, що викликає. Символи, які розділяють ці підрядки, передаються в масиві separator. Якщо масив separator порожній, то як роздільник використовується пробіл. А в третій та четвертій формах даного методу повертається кількість рядків, що обмежується параметром count.

Але у всіх формах параметр options позначає конкретний спосіб обробки порожніх рядків, які утворюються у разі, якщо два роздільника виявляються поруч. У перерахунку StringSplitOptions визначаються лише два значення: Noneі RemoveEmptyEntries. Якщо параметр options приймає значення None, то порожні рядки включаються до кінцевого результату поділу вихідного рядка. Якщо параметр options приймає значення RemoveEmptyEntries, то порожні рядки виключаються з кінцевого результату поділу вихідного рядка.

Join() public static string Join(string separator, string value)

Public static string Join(string separator, string value, int startIndex, int count)

Будує новий рядок, комбінуючи вміст масиву рядків.

У першій формі методу Join() повертається рядок, що складається зі зчеплених підрядків, що передаються в масиві value. У другій формі також повертається рядок, що складається з підрядків, що передаються в масиві value, але вони зчіплюються у певній кількості count, починаючи з елемента масиву value. В обох формах кожен наступний рядок відокремлюється від попереднього роздільного рядка, що визначається параметром separator.

Заповнення та обрізання рядків
Trim() public string Trim()

Public string Trim(params char trimChars)

Метод, який дозволяє видаляти всі входження певного набору символів з початку та кінця поточного рядка.

У першій формі методу Trim() з рядка, що викликає, видаляються початкові і кінцеві пробіли. А в другій формі цього методу видаляються початкові і кінцеві входження в рядок символів з масиву trimChars. В обох формах повертається рядок, що отримується в результаті.

PadLeft() public string PadLeft(int totalWidth)

Public string PadLeft(int totalWidth, char paddingChar)

Дозволяє доповнити рядок символами ліворуч.

У першій формі методу PadLeft() вводяться прогалини з лівого боку рядка, що викликає, щоб її загальна довжина стала рівною значенню параметра totalWidth. А в другій формі даного методу символи, що позначаються параметром paddingChar, вводяться з лівого боку рядка, що викликає, щоб її загальна довжина стала рівною значенню параметра totalWidth. В обох формах повертається рядок, що отримується в результаті. Якщо значення параметра totalWidth менше довжини рядка, то повертається копія незміненого рядка.

PadRight() Аналогічно PadLeft()

Дозволяє доповнити рядок символами праворуч.

Вставка, видалення та заміна рядків
Insert() public string Insert(int startIndex, string value)

Використовується для вставки одного рядка в інший, де value позначає рядок, що вставляється в рядок, що викликає, за індексом startIndex. Метод повертає рядок, що вийшов у результаті.

Remove() public string Remove(int startIndex)

Public string Remove(int startIndex, int count)

Використовується для видалення частини рядка. У першій формі методу Remove() видалення виконується, починаючи з місця, що вказується за індексом startIndex, і продовжується до кінця рядка. А в другій формі даного методу з рядка видаляється кількість символів, що визначається параметром count, починаючи з місця, що вказується за індексом startIndex.

Replace() public string Replace(char oldChar, char newChar)

Public string Replace(string oldValue, string newValue)

Використовується для заміни частини рядка. У першій формі методу Replace() всі входження символу oldChar у рядку, що викликає, замінюються символом newChar. А в другій формі даного методу всі входження рядка oldValue в рядок, що викликає, замінюються рядком newValue.

Зміна регістру
ToUpper() public string ToUpper()

Робить великими всі літери в рядку, що викликає.

ToLower() public string ToLower()

Робить малими всі літери в рядку, що викликає.

Отримання підрядка з рядка
Substring() public string Substring(int startIndex)

Public string Substring(int startIndex, int length)

У першій формі методу Substring() підрядок витягується, починаючи з місця, що позначається параметром startIndex, і до кінця рядка, що викликає. А в другій формі даного методу витягується підрядок, що складається з кількості символів, що визначаються параметром length, починаючи з місця, що позначається параметром startIndex.

Приклад наступної програми використовує кілька із зазначених методів:

Using System; використовуючи System.Collections.Generic; використовуючи System.Linq; використовуючи System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // Порівняємо перші два рядки string s1 = "це рядок"; string s2 = "це текст, а це рядок"; 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" + "Один, два", "три, чотири")); // Пошук у рядку // Перше входження підрядка if (s2. IndexOf("це") != -1) Console.WriteLine("Слово \"це\" знайдено в рядку, воно "+" знаходиться на: (0) позиції", s2.IndexOf("це")); / Останнє входження підрядка if (s2.LastIndexOf("це") != -1) Console.WriteLine("Остання входження слова \"це\" знаходиться " + "на (0) позиції", s2.LastIndexOf("це" ));// Пошук з масиву символів char myCh = ("И","х","т"); if (s2.IndexOfAny(myCh) != -1) "+ "знайдений у поточному рядку на позиції (0)", s2.IndexOfAny(myCh)); // Визначаємо чи починається рядок із заданої підрядки if (s2.StartsWith("це текст") == true) Console.WriteLine("Підстрока знайдена!"); // Визначаємо чи міститься у рядку підрядок // з прикладу визначення ОС користувача string myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Ваша операційна система Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Ваша операційна система Windows 7"); Console.ReadLine(); ) ) )

Трохи про порівняння рядків у C#

Ймовірно, з усіх операцій обробки символьних рядків найчастіше виконується порівняння одного рядка з іншим. Перш ніж розглядати будь-які методи порівняння рядків, слід наголосити на наступному: порівняння рядків може бути виконане в середовищі.NET Framework двома основними способами:

    По-перше, порівняння може відображати звичаї та норми окремого культурного середовища, які найчастіше є налаштуваннями культурного середовища, що вступають в силу при виконанні програми. Це стандартна поведінка деяких, хоч і не всіх методів порівняння.

    І по-друге, порівняння може бути виконане незалежно від налаштувань культурного середовища лише за порядковими значеннями символів, що становлять рядок. Взагалі кажучи, при порівнянні рядків без урахування культурного середовища використовується лексикографічний порядок (і лінгвістичні особливості), щоб визначити, чи є один рядок більшим, меншим або рівним іншому рядку. При порядковому порівнянні рядки просто впорядковуються на підставі незмінного значення кожного символу.

Через відмінності способів порівняння рядків з урахуванням культурного середовища та порядкового порівняння, а також наслідків кожного такого порівняння настійно рекомендується керуватися кращими методиками, пропонованими в даний час корпорацією Microsoft. Адже вибір невірного способу порівняння рядків може призвести до неправильної роботи програми, коли вона експлуатується в середовищі, яке відрізняється від того, в якому вона розроблена.

Вибір способу порівняння символьних рядків є дуже відповідальним рішенням. Як правило і без будь-яких винятків, слід вибирати порівняння рядків з урахуванням культурного середовища, якщо це робиться з метою відображення результату користувачеві (наприклад, для виведення на екран ряду рядків, відсортованих у лексикографічному порядку). Але якщо рядки містять фіксовану інформацію, не призначену для зміни з урахуванням відмінностей у культурних середовищах, наприклад, ім'я файлу, ключове слово, адреса веб-сайту або значення, пов'язане із забезпеченням безпеки, слід вибрати порядкове порівняння рядків. Зрозуміло, особливості конкретного програми, що розробляється, диктуватимуть вибір відповідного способу порівняння символьних рядків.

У класі String надаються різні методи порівняння рядків, які перераховані в таблиці вище. Найбільш універсальним у тому числі є метод Compare(). Він дозволяє порівнювати два рядки повністю або частково, з урахуванням або без урахування регістру, способу порівняння, що визначається параметром типу StringComparison, а також відомостей про культурне середовище, що надаються за допомогою параметра типу CultureInfo.

Ті варіанти методу Compare(), які не містять параметр типу StringComparison, виконують порівняння символьних рядків з урахуванням регістру і культурного середовища. А в тих варіантах, що перевантажуються його, які не містять параметр типу CultureInfo, відомості про культурне середовище визначаються поточним середовищем виконання.

Тип StringComparison є перерахуванням, в якому визначаються значення, наведені в таблиці нижче. Використовуючи ці значення, можна організувати порівняння рядків, що задовольняє потреби конкретної програми. Отже, додавання параметра типу StringComparison розширює можливості методу Compare() та інших методів порівняння, наприклад Equals(). Це дає можливість однозначно вказувати спосіб передбачуваного порівняння рядків.

В силу відмінностей між порівнянням рядків з урахуванням культурного середовища та порядковим порівнянням дуже важливо бути гранично точним у цьому відношенні.

Значення, визначені у перерахунку StringComparison
Значення Опис
CurrentCulture Порівняння рядків здійснюється за допомогою поточних налаштувань параметрів культурного середовища
CurrentCultureIgnoreCase Порівняння рядків здійснюється з використанням поточних налаштувань параметрів культурного середовища, але без урахування регістру
InvariantCulture Порівняння рядків проводиться з використанням незмінних, тобто. універсальних даних про культурне середовище
InvariantCultureIgnoreCase Порівняння рядків проводиться з використанням незмінних, тобто. універсальних даних про культурне середовище та без урахування регістру
Ordinal Порівняння рядків здійснюється за допомогою порядкових значень символів у рядку. При цьому лексикографічний порядок може порушитись, а умовні позначення, прийняті в окремому культурному середовищі, ігноруються
OrdinalIgnoreCase Порівняння рядків здійснюється з використанням порядкових значень символів у рядку, але без урахування регістру

У будь-якому випадку метод Compare() повертає негативне значення, якщо перший порівнюваний рядок виявляється меншим за другий; позитивне значення, якщо перший порівнюваний рядок більший за другий; і нарешті, нуль, якщо обидві порівнювані рядки рівні. Незважаючи на те, що метод Compare() повертає нуль, якщо порівнювані рядки рівні, для визначення рівності символьних рядків, як правило, краще користуватися методом Equals() або оператором ==.

Річ у тім, що метод Compare() визначає рівність рядків, що порівнюються, на підставі порядку їх сортування. Так, якщо виконується порівняння рядків з урахуванням культурного середовища, то обидва рядки можуть виявитися однаковими за порядком їх сортування, але не рівними по суті. За замовчуванням рівність рядків визначається методом Equals(), з порядкових значень символів без урахування культурного середовища. Отже, за умовчанням обидва рядки порівнюються у цьому методі на абсолютну, посимвольну рівність подібно до того, як це робиться в операторі ==.

Незважаючи на більшу універсальність методу Compare(), для простого порівняння символьних рядків простіше користуватися методом CompareOrdinal(). І, насамкінець, слід пам'ятати, що метод CompareTo() виконує порівняння рядків лише з урахуванням культурного середовища.

У наведеній нижче програмі демонструється застосування методів Compare(), Equals(), CompareOrdinal(), а також операторів == та!= для порівняння символьних рядків. Зверніть увагу на те, що два перші приклади порівняння наочно демонструють відмінності між порівнянням рядків з урахуванням культурного середовища та порядковим порівнянням в англомовному середовищі:

Using System; class Example ( static void Main() ( string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int result; / / Спочатку продемонструвати відмінності між порівнянням рядків // з урахуванням культурного середовища та порядковим порівнянням result = String.Compare(str1, str2, StringComparison.CurrentCulture); ) Console.WriteLine(str1 + " більше " + str2); else Console.WriteLine(str1 + " одно " + str2); result = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write("Порядкове порівняння рядків: "); if (result 0) Console.WriteLine(str1 + " більше " + str2); else Console.WriteLine(str1 + " одно " + str4); // Використовувати метод CompareOrdinal() str1, str2);Console.Write("Порівняння рядків методом CompareOrdinal():\n"); + str4); Console.WriteLine(); // Визначити рівність рядків за допомогою оператора == // Це порядкове порівняння символьних рядків if (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() з " + "параметром OrdinalI: \n" + str1 + " одно " + str2); Console.WriteLine(); // Порівняти частини рядків if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Порівняння рядків з урахуванням поточного культурного середовища:" + "\n3 перших символів рядка " + str2 + " більше, ніж 3 перших символи рядка " + str5); ) ) )

Виконання цієї програми призводить до наступного результату: