[Autumn Series] Символни низове

Отговори
Потребителски аватар

Автор на темата
Autumn Shade EA\DICE
Developer
Developer
Мнения: 166
Регистриран: 14 мар 2019, 13:20
Се отблагодари: 26 пъти
Получена благодарност: 102 пъти

[Autumn Series] Символни низове

Мнение от Autumn Shade EA\DICE » 14 авг 2019, 15:41

Съдържание:
  • Какво е символен низ?
  • Видове символни низове
  • Упражнение
  • Какво следва?

Какво е символен низ?

Символният низ представлява крайна редица от еднотипни елементи от тип char или по-кратко казано масив от символи. Разликата с масивите е, че символните низове имат един специфичен символ, който се слага накрая на символният низ наричан още нулев терминатор. (null-terminator) Този нулев терминатор определя краят на символният низ.

Как и къде се използват символните низове?
Представете си, че искате на екрана да напишете Enter your number. Това се пише чрез cout << "Enter your number" << endl; и е символен низ. Този така наречен нулев терминатор ние не го виждаме като изход било то в конзола или визуален статичен текст, но той съществува и изглежда по този начин:
cout << "Enter your number\0" << endl;

Правилно, той е тази нуличка, която върви заедно с наклонената черта. Това не ви е много важно, просто го казваме да го знаете. Може да ви се наложи, ако работите на по-ниско ниво. :think:

Видове символни низове
Има два вида символни низове и те са още старите, които най-вероятно всички ги знаят и те са едни гадни и отвратителни символни низове, наречени C-style символни низове и вторият вид са новите, които не са по-малко гадни, но са по-удобни и лесни за използване поне ;) - библиотеката string на C++.

Ще разгледаме и двата вида подробно и ще кажем разлики и кое е за предпочитане за използване.
  • C-style символни низове - Те представляват точно масиви от символен тип. Ето един пример как можем да декларираме един символен низ:

    Код: Избери всички

    char hello[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
    // Или char* hello = "Hello";
    
    cout << hello << endl;
    
    След като се изпълни кода, на екрана трябва да ви се покаже думата Hello. Към този вид символни низове ще добавим и няколко функции, които можете да използвате.
     ! Съобщение от: Autumn Shade
    Не можете да използвате операторите за сравнение, присвояване, събиране/изваждане/деление/умножение с този вид символни низове! Има си специална библиотека и функции готови за използване за тази цел!
    Библиотеката се казва cstring и в нея се съдържат няколко функции:
    • strcpy - Приема два параметъра, които са символни низове.
      Синтаксис:

      Код: Избери всички

      strcpy(<символен низ 1>, <символен низ 2>);
      
      Действие:
      Копира <символен низ 2> в <символен низ 1>.
    • strcat - Приема два параметъра, които са символни низове.
      Синтаксис:

      Код: Избери всички

      strcat(<символен низ 1>, <символен низ 2>);
      
      Действие:
      Добавя <символен низ 2> в края на <символен низ 1>.
    • strlen - Приема един параметър.
      Синтаксис:

      Код: Избери всички

      strlen(<символен низ 1>);
      
      Действие:
      Връща дължината на <символен низ 1>.
    • strcmp - Приема два параметъра, които са символни низове.
      Синтаксис:

      Код: Избери всички

      strcmp(<символен низ 1>, <символен низ 2>);
      
      Действие:
      Връща нула, ако <символен низ 2> и <символен низ 1> са равни, връща -1, ако <символен низ 1> е с по-малък от <символен низ 2> и връща 1 ако <символен низ 1> е по-голям от <символен низ 2>.
    • strchr - Приема два параметъра - един символен низ и един символ.
      Синтаксис:

      Код: Избери всички

      strchr(<символен низ>, <символ>);
      
      Действие:
      Връща позицията на първият срещнат символ в <символен низ>, който е същият като <символ>.
    • strstr - Приема два параметъра.
      Синтаксис:

      Код: Избери всички

      strlen(<символен низ 1>, <символен низ 2>);
      
      Действие:
      Връща позицията на първата срещната част в <символен низ 1>, която е същата като <символен низ 2>.
    Нека да дадем и пример:

    Код: Избери всички

    #include <iostream>
    #include <cstring> // Библиотеката ни трябва, за да използваме гореспоменатите функции
    
    using namespace std;
    
    int main () {
    
       char str1[10] = "AMXX";	// Символен низ 1
       char str2[10] = "BG";	// Символен низ 2
       char str3[10]; 		// Символен низ 3
       int  len; 			// Размер
    
       // Копираме str1 в str3
       strcpy( str3, str1);
       cout << "strcpy( str3, str1) : " << str3 << endl;
    
       // Добавя str2 към str1
       strcat( str1, str2);
       cout << "strcat( str1, str2): " << str1 << endl;
    
       // Взема размера на str1 след добавянето
       len = strlen(str1);
       cout << "strlen(str1) : " << len << endl;
    
       return 0;
    }
    
    По този начин можете да използвате тези функции.
  • String библиотеката в C++ - Там нещата се случват доста по-лесно и я препоръчвам на всеки, който се мъчи с тези стари C-style символни низове. Няма смисъл от тях, освен ако не работите на ниско ниво. Ще обясня и защо. Разликата между C и C++ символните низове е, че едното работи на класове и прави използването му по-лесно, но затруднява обработката на информация като битове и байтове. Това е C++ String библиотеката. Докато C-style символните низове могат да се четат байт по байт и бит по бит доста по-лесно, което прави управлението на даден устройства, които срещаме всеки ден в пъти по-лесно, отколкото да се чудим какво става точно отдолу и да минаваме през десетки неща както прави C++ String библиотеката.

    Тя е по-полезна, когато правим неща като софтуерни програми, които са по-скоро нещо подобно на skype, notepad и други такива. Нека видим как можем да направим същата програма като тази на C-style символните низове, само че като използваме C++ String библиотеката:

    Код: Избери всички

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main () {
    
       string str1 = "AMXX"; 	// Символен низ 1
       string str2 = "BG";		// Символен низ 2
       string str3;			// Символен низ 3
       int  len;				// Размер
    
       // Копира str1 в str3
       str3 = str1;
       cout << "str3 : " << str3 << endl;
    
       // Добавя str2 към края на str1
       str3 = str1 + str2;
       cout << "str1 + str2 : " << str3 << endl;
    
       // Взема общият размер на str3
       len = str3.size();
       cout << "str3.size() :  " << len << endl;
    
       return 0;
    }
    Доста по-лесно е нали? Даже има познати неща! Виждате ли разликата? Реално, използвайте което ви е по-удобно. От лична гледна точка препоръчвам string библиотеката, защото има доста повече функционалност.

Упражнение
Да се създаде програма, която да създава символни низове от двата типа и да ги извежда на екрана. След това да проверява дали са еднакви и ако са, да изписва на екрана, че са.

Пример:
Имаме един символен низ от c-style, който е char str1[6] = { 'H', 'e', 'l', 'l', 'o', '\0' }; и един от string библиотеката string str2 = "Hello"; и още два за всеки тип, за да ги използвате в сравнението.

Какво следва?
В следващият пост ще преминем към функции.

Потребителски аватар

mi0 nope
AMXX Скриптър
AMXX Скриптър
Мнения: 199
Регистриран: 09 дек 2016, 22:02
Се отблагодари: 49 пъти
Получена благодарност: 40 пъти
Години: 26
Контакти:

[Autumn Series] Символни низове

Мнение от mi0 nope » 14 авг 2019, 15:59

Отностно функциите от cstring, ако използвате Visual Studio, от microsoft направиха функциите deprecated и добавиха нови със suffix "_s", под предлога че са unsafe, понеже причиняват buffer overflow и тем подобни error-и. Ако все пак искате да ги използвате дефинирайте "_CRT_SECURE_NO_WARNINGS". Но все пак, по-добре ще е да ползвате функциите със "_s".
Става на въпрос само за - strcpy(<символен низ 1>, <символен низ 2>); и strcat(<символен низ 1>, <символен низ 2>);.

Потребителски аватар

Автор на темата
Autumn Shade EA\DICE
Developer
Developer
Мнения: 166
Регистриран: 14 мар 2019, 13:20
Се отблагодари: 26 пъти
Получена благодарност: 102 пъти

[Autumn Series] Символни низове

Мнение от Autumn Shade EA\DICE » 14 авг 2019, 17:42

mi0 написа:
14 авг 2019, 15:59
Отностно функциите от cstring, ако използвате Visual Studio, от microsoft направиха функциите deprecated и добавиха нови със suffix "_s", под предлога че са unsafe, понеже причиняват buffer overflow и тем подобни error-и. Ако все пак искате да ги използвате дефинирайте "_CRT_SECURE_NO_WARNINGS". Но все пак, по-добре ще е да ползвате функциите със "_s".
Става на въпрос само за - strcpy(<символен низ 1>, <символен низ 2>); и strcat(<символен низ 1>, <символен низ 2>);.
За да е cross-compile-safe или универсално, по-добре е да се ползват strncatи strncmp, понеже това с _s е пак стандарт, но не е точно универсално.

Отговори

Върни се в “Системно Програмиране”

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 1 гост