Текстуални низи

Презентација III - 4 

https://www.tutorialspoint.com/cplusplus/cpp_strings.htm

mendo.mk

Низи од знаци

C++ овозможува работа со текстуални податоци на неколку начини.
- koристење на класата string
- работа со текстуални податоци преку нивно третирање како низа од знаци (низа од податок char)


Низи од знаци се креираат на ист начин како и останатите еднодимензионални низи:

char ime[N];

ime го означува името на променливата, 
N го означува бројот на знаци (од колку елементи е составена низата ime). 
Еден од овие N знаци (зависно од текстуалниот податок кој ќе се чува во низата) ќе биде еднаков на '\0' - и ќе претставува т.н. null знак или null terminator. Овој знак е потребен за да го означи крајот на текстуалниот податок и да ни овозможи во низа со големина N да чуваме текстуални елементи кои се пократки од N знаци. 
На следната слика е претставен начинот на сместување на текстуални податоци во низата од знаци name[13]:


На овој начин, кога сакаме да печатиме податоци, програмата знае дека треба да печати знаци сé додека не стигне до знакот '\0'. Сите знаци по '\0' се неважни и не се користат.

C++ овозможува иницијализација на овие низи од знаци на 2 начини:

char name[] = {'M', 'a', 'r', 'k', 'o', '\0'};             //treba da se navede '\0'
char name[] = "Marko";                                   //se podrazbira '\0'

И двата начина креираат низа name со големина 6. Низата го содржи текстуалниот податок "Marko" и null знак '\0' за означување на крај на текстот. Бидејќи низите имаат големина која се дефинира при нивното креирање, не е дозволено подоцнежно менување на нивната вредност преку користење на операторот '=' (кај string класата ова е дозволено - таа работи со динамички резервирана меморија). 
На пример, следниов код е погрешен:

char name[] = "Marko";
name = "Petar"; //GRESHKA!

Следната програма прикажува како може да се користат низите од знаци во комбинација со потоците cin и cout:

#include <iostream>
using namespace std;
int main()
{
char array[] = "Darko";
array[0] = 'M';              
cout << array << endl; // pechati 'Marko'
char text[100];
cout << "Vnesi eden zbor: ";
cin >> text;                    //vnesi  eden zbor
cout << text;                  //go pechati vneseniot zbor
return 0;
}

Marko            
Vnesi eden zbor: Prograsmki jazici    
Programski  

Наредбата cin >> text; чита еден збор внесен од страна на корисникот и, истиот го сместува во променливата text. На крајот од текстот, автоматски, се додава и null знак
cin чита податоци до првото појавување на празно место, tab или знак за нов ред,

Внесување текст кој содржи повеќе зборови 
- со cin.getline()
cin.get ( )

Клучната разлика помеѓу get и getline

Ова е најважниот дел за разбирање:

  • cin.getline(): Го чита текстот И го отстранува карактерот за нов ред (\n) од баферот (меморијата). Следниот внес ќе започне „на чисто“.

  • cin.get(): Го чита текстот, но го ОСТАВА карактерот за нов ред (\n) во меморијата.

Зошто е ова важно? Ако се обидеш да повикаш cin.get() двапати по ред, вториот пат програмата нема ни да ти дозволи да пишуваш, бидејќи веднаш ќе го прочита преостанатиот \n од првиот пат и ќе мисли дека си завршил.


#include <iostream>
using namespace std;
int main()
{
    char str[20];
    cout << "Enter Your Name::";
    cin.getline(str, 20);
    cout << "\nYour Name is:: " << str;
    return 0;
}
Enter Your Name::Marija Atanasoska 
Your Name is:: Marija Atanasoska

#include <iostream> 
using namespace std; 
int main()
 { char str[100];
   cout << "Enter a text: "; 
   cin.get(str, 100);
  cout << "You entered: " << str << endl; 
return 0;
 }
Enter a тext: Programming is fun.
You entered: Programming is fun.
#include <iostream>
using namespace std;
int main() {
    char ime[50];
    char adresa[50];
    cout << "Vnesi ime: ";
    cin.get(ime, 50);
    cin.get(); // ОВА Е ВАЖНО: Го вади '\n' од меморијата за да не го прескокne следниот внес
    cout << "Vnesi adresa: ";
    cin.get(adresa, 50);
    cout << "Ime: " << ime << ", Adresa: " << adresa << endl;
    return 0;
}

Vnesi ime: Marija Petreska 
Vnesi adresa: Partizanska broj 23
Ime: Marija Petreska , Adresa: Partizanska broj 23

#include <iostream>
using namespace std;
int main()
{
char array[] = "Darko";   //array[0]='D' 
array[0] = 'M';              
cout << array << endl; // pechati 'Marko'
char text[100];
cout << "Vnesi edna recenica: ";
//cin >> text;                    //vnesi  eden zbor
//cout>>text;
cin.getline(text, 100);
cout << text;  
cin.ignore();
cout << "Vnesi druga  recenica: ";
cin.getline(text, 100);
cout<<text;
return 0;
}
Marko
Vnesi edna recenica: Rabota vo C++
Rabota vo C++
Vnesi druga  recenica: Programski jazici
Programski jazici

C++ string using string data type
#include <iostream>
using namespace std;
int main()
{
    // Declaring a string object
    string str;
    cout << "Enter a string: ";
    getline(cin, str);
    cout << "You entered: " << str << endl;
    return 0; }
Enter a string: Programming is fun.
You entered: Programming is fun.

Постојат 7 основни функции кои овозможуваат работа со текстуални низи (сите дефинирани во датотеката "<cstring>"):


Функции за работа со знаци:

- isalpha(ch) – true ако ch е алфабетски знак инаку false
- isupper(ch)- true ако ch е голема буква инаку false
- islower(ch)- true ако ch е мала буква инаку false
- isdigit(ch)- true ако ch е цифра од 0 до 9 инаку false
- toupper(ch), tolower(ch) – претвораат во мала т.е. во голема буква

Примери :

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
      char a[] = "prva niza";
      char b[] = "vtora niza";
      char c[] = "tekst";
      char d[] = "tekst";
       
      cout << strlen(a) << endl;          //pechati '9'
      cout << strlen(c) << endl;          //pechati '5'
      char t[100];
      strcpy(t, "Nekoja vrednost");       //t="Nekoja vrednost"
      strcpy(t, "Neshto drugo");           //t="Neshto drugo"
      strcpy(t, a);                                  //t="prva niza"
      strncpy(t, b, 4);                           //t="vtor niza" (ne se kopira '\0')
      cout<<"t="<<t<<endl;
      t[4] = '\0';                                   //t="vtor"
       
      strcat(t, b);                                //t="vtorvtora niza"
      cout << t << endl;                   //pechati 'vtorvtora niza'
      cout << strcmp(t, a) << endl;       //pechati '1'
      cout << strcmp(c, d) << endl;       //pechati '0'
      return 0;
}

strncpy(t, b, 4);?

Функцијата strncpy со аргумент 4 вели: "Оди кај стрингот b ("vtora niza"), земи ги првите 4 букви (v, t, o, r) и стави ги во првите 4 места на t."

Клучниот момент: Таа само ги пребришува тие 4 места. Не ја допира меморијата после четвртиот карактер и не става ознака за крај (\0).

strncpy - копира букви како робот. Ако не ја „затвориш“ низата со \0, таа ќе го покажува и стариот текст што останал во меморијата.

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
      string a, b;
      a = "prv";
      b = "vtor";
      cout << a.size() << endl;       //pechati '3'
      cout << b.size() << endl;       //pechati '4'
      a = a + " " + b;
      cout << a << endl;              //pechati 'prv vtor'
      b = b + b;
      cout << b << endl;              //pechati 'vtorvtor';
      return 0;
}


1. What character ends all strings?
A. '.'
B. ' '
C. '\0'
D. '\n'

2. Which of the following reads in a string named x with one hundred characters?
A. cin.getline(x, 100, '\n');
B. cin.getline(100, x, '\n');
C. readline(x, 100, '\n');
D. read(x);

3. Which of the following functions compares two strings?
A. compare();
B. stringcompare();
C. cmp();
D. strcmp();

4. Which of the following adds one string to the end of another?
A. append();
B. stringadd();
C. strcat();
D. stradd();





No comments: