Сатрхо

Дар C++ сатр дар асл массиви рамзхо (char) мебошад. Лекин якчанд функсияхои гуногун мавчуданд, ки махз барои кор бо сатрхо офарида шудаанд, ба монанди ба як сатр пайваст кардани сатри дигар, муайян кардани дарозии сатр, муаяйн кардани якхела будани сатрхо ва гайра. Сатрхо барои нигох доштани маълумоти дарози дохилшаванда лозиманд, ба мисоли фамилия, номи давлатхо, молхо.

Сатр ин пайдарпаии рамзхо, ки дар ин пайдарпаи зиёда аз як рамз мавчуд аст, мебошад. Дар хотира сатр хамчун массиви рамзхои чудогона, ки элементи охирони ин массив элементи нули '\0' аст, нигох дошта мешавад. Сатри статики гуфта пайдарпаии рамзхои байни нохунакхо " ва " чойгир бударо меноманд. Масалан,

"Imruz havo garm!" 

сатри статики аст. Дар хотира ин сатр хамчун массиви рамзхои чудогона нигох дошта мешавад:

{'I','m','r','u','z',' ','h','a','v','o',' ','g','a','r','m','!','\0'} 

Якто рамз сатр нест, лекин онро хамчун сатр низ истифода бурдан мумкин аст. Масалан, "L" сатр аст. Дар хотира ин сатр хамчун массиви иборат аз ду рамзи чудогона нигох дошта мешавад: {'L', '\0'}.

Сохтори умумии эълони сатр чунин аст:

char str_name[length+1]; 

Дар ин чо str_name - номи сатр, length - микдори зиёдтарини рамзхо, ки шумо дар сатри str_name нигох доштан мехохед. Дар эълон length+1 бо назардошти элементи охирони сатр - элементи нули, ки хамчун нишони охири сатр хизмат мекунад, навишта шудааст.

Барои эълон кардани сатри иборат то 50 харф шумо бояд нависед:

char satr[51]; 

Мисол:

//namuna24.cpp
using namespace std;
#include <iostream>
int main() {
char str1[20], str2[20];
cout<<"Nasabi Shumo: ";
cin>>str1;
cout<<"Nomi Shumo: ";
cin>>str2;
cout<<str2<<" nasabi shumo ";
cout<<str1<<"!"<<endl;
return 0;
}

Истифодаи cin барои дохил кардани сатр мумкин аст, лекин кисми сатри шумо, ки баъди фосила меояд гум мешавад. Дар мисоли барномаи зерин инро санчидан мумкин аст:

//namuna25.cpp
using namespace std;
#include <iostream>
int main() {
char str1[80];
cout<<"Satrro dokhil kuned: ";
cin>>str1;
cout<<"Satri shumo: "<<endl;
cout<<str1<<endl;
return 0;
}

Агар дар рафти ичрои ин барнома сатри "Kalimahobefosilachopshudaand" дохил карда шавад, дар экран он айнан пайдо мешавад: Kalimahobefosilachopshudaand. Лекин агар сатри "Kalimaho bо fosila chop shudaand" дохил карда шавад, дар экран Kalimaho, яъне факат кисми то якум фосила пайдо мешаваду халос. Як рох барои халли ин мушкилот ин истифода бурдани функсияи cin.getline мебошад. Аз руи сохташ cin ин класс аст ва мо яке аз функсия-аъзохои ин класс, функсияи getline()-ро истифода мебарем. Яке аз мухимтарин чизхо ин донистани тарзи истифодаи ин ё он функсия мебошад, ки барои ин донистани тимсоли он зарур аст. Тимсоли функсияи getline() чунин аст:

cin.getline(char *buffer, int length, char teminal_char); 

Дар ин чо char *buffer ишоракунак ба элементи якуми массиви рамзхо мебошад, ки он барои дастрас намудани мавкеи сатр дар хотира истифода бурда мешавад. Дар ин кисм номи массиви рамзхоро нишон додан зарур аст. Адади бутуни length барои ба дарозии сатри дохилшаванда махдудият гузоштан истифода бурда мешавад. Яъне агар микдори рамзхои сатри дохилшуда аз length кам бошад, он дар массиви buffer чойгир карда мешавад. Ва агар микдори рамзхои сатри дохилшуда аз length зиёд бошад, факат length-то элементи аввали ин сатр дар массиви buffer чойгир карда мешаванд. Барои шикаст нахурдани барнома length набояд аз дарозии массиви buffer зиёд бошад. Рамзи teminal_char барои он лозим аст, ки агар дар сатри дохилшуда хамин рамз мавчуд бошад, кисми баъди ин рамз будаи сатр ба массиви buffer кабул карда намешавад. Агар рамзи teminal_char нишон дода нашуда бошад, ба сифати он, аз руи хомуши (default value), рамзи сатри нав '\n' кабул карда мешавад, яъне пахши клавишаи Enter. Дар ин чо барои ба компилятор хабар додани рамз нохунакхои дучанда не, балки апостроф (') истифода шудааст.

Мисол:

//namuna26.cpp
using namespace std;
#include <iostream>
int main() {
char str1[80], str2[80];
cout<<"Satri 1-ro dokhil kuned: "<<endl;
cin.getline(str1,70);
cout<<"Satri 2-ro dokhil kuned: "<<endl;
cin.getline(str2,20,'d');
cout<<"Satri 1-mi shumo: "<<endl;
cout<<str1<<endl;
cout<<"Satri 2-mi shumo: "<<endl;
cout<<str2<<endl;
return 0;
}

Дар ин барнома ба сатри str1 то 69 рамз кабул карда мешавад. Дохилкуни ба сатри str2 то расидани микдори рамзхои дохилшуда ба 19 ё то вохурдани рамзи 'd' давом мекунад.

Фахмидан зарур аст, ки ба функсияи getline() худи сатр не, факат адреси ин сатр накл карда мешавад. Массивхо дар оператори ишора (&) зарурият надоранд, барои муайян намудани адреси ибтидои массив номи массив кифоя аст.

Дар файли сарлавхавии <string.h> бисёр функсияхои барои кор бо сатрхо муфид оварда шудаанд. Яке аз онхо функсияи мукоисаи сатрхо мебошад, ки тимсоли он чунин аст:

int strcmp(const char *s1, const char *s2); 

Ин функсия хамчун аргумент ду сатрро кабул карда, хамчун натича адади бутунро бозмегардонад. Ин адад:

  • манфи аст, агар s1 аз s2 хурд бошад;

  • нул аст, агар s1 ба s2 баробар бошад;

  • мусбат аст, агар s1 аз s2 калон бошад;

Функсияи strcmp() ба харфхои хурду калон хассос (case sensitive) аст.

Боз як функсияи мукоисаи сатрхо мавчуд мебошад, ки тимсоли он чунин аст:

int strcmpi(const char *s1, const char *s2); 

Ин функсия хамчун аргумент ду сатрро кабул карда, хамчун натича адади бутунро бозмегардонад. Ин адад:

  • манфи аст, агар s1 аз s2 хурд бошад;

  • нул аст, агар s1 ба s2 баробар бошад;

  • мусбат аст, агар s1 аз s2 калон бошад;

Функсияи strcmpi() ба харфхои хурду калон хассос нест (not case sensitive). Яъне харфхои хурду калонро фарк намекунад. Ин функсия дар стандарти ANSI C++ нест.

Функсия барои пайвасти сатрхо мавчуд мебошад, ки тимсоли он чунин аст:

char *strcat(char *s1, char *s2); 

Ин функсия хамчун аргумент ду сатрро кабул карда, сатри дуюмро ба давоми сатри якум пайваст мекунад. Хамчун натича ишора ба сатри навро бозмегардонад.

Функсия барои нусха бародоштани сатр мавчуд мебошад, ки тимсоли он чунин аст:

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

Ин функсия хамчун аргумент ду сатрро кабул карда, сатри дуюмро ба сатри якум нусха мебардорад. Хамчун натича ишора ба сатри нусхаро бозмегардонад.

Функсияи strupr() хамаи харфхои сатрро бо харфои калон иваз мекунад ва хамчун натича ишора ба сатри навро бозмегардонад. Тимсоли он чунин аст:

char *strupr(char *str); 

Агар аргументи функсия сатри статики набошад, харфхои он низ бо харфхои калон иваз карда мешаванд. Ин функсия дар стандарти ANSI C++ нест.

Функсияи strlwr() хамаи харфхои сатрро бо харфои хурд иваз мекунад ва хамчун натича ишора ба сатри навро бозмегардонад. Тимсоли он чунин аст:

char *strlwr(char *str); 

Агар аргументи функсия сатри статики набошад, харфхои он низ бо харфхои хурд иваз карда мешаванд.

Функсияи strlen() дарозии сатрро бе хисоб кардани элементи нули '\0' хамчун натича бозмегардонад. Тимсоли он чунин аст:

size_t strlen(const char *str); 

Дар ин чо size_t яке аз намудхои адади бутун аст.

Як мисолеро, ки дар он функсияхои болои истифода шудаанд меорем:

Мисол:

//namuna27.cpp
using namespace std;
#include <iostream>
#include <string>
int main() {
char nom[20], nasab[20], nn[40], javob[3];
do {
cout<<"Nomi Shumo: ";
cin.getline(nom,20);
cout<<"Nasabi Shumo: ";
cin.getline(nasab,20);
strcpy(nn,nom);
strcat(nn," ");
cout<<"Nomi shumo iborat az ";
cout<<strlen(nom)<<" harf"<<endl;
cout<<"Nasabi shumo iborat az ";
cout<<strlen(nasab)<<" harf"<<endl;
strcat(nn,nasab);
cout<<"Nomi shumo ba'di strlwr: ";
strlwr(nom);
cout<<nom<endl;
cout<<"Nasabi shumo ba'di strupr: ";
strupr(nasab);
cout<<nasab<<endl;
cout<<nn;
cout<<" kori programmaro davom dihem?";
cout<<"(ha/ne) ";
cin.getline(javob,3);
cin.ignore();
}while(!strcmpi(javob,"HA"));
return 0;
}

Баъди ба саволи "kori programmaro davom dihem?" чавоб дода, тугмаи Enter-ро пахш кардан, дар хотираи фаври як рамзи сатри нав боки мемонад, ки он дар кори минбаъдаи барнома халал расониданаш мумкин аст. Барои ин рамзро аз хотира тоза кардан функсияи ignore() истифода шудааст.

САВОЛХО БАРОИ МУСТАХКАМКУНИ
1. Барои чи хангоми кор бо сатрхо истифодаи функсияи getline() кулайтар аст?
2. Барнома ба охир расидани сатрро чи хел мефахмад?
3. Вазифаи функсияи ignore() аз чи иборат аст?
4. Хусусиятхои компилятори худро омухта, боз якчандто функсияхои коркарди сатрро, ки дар ин чо оварда нашудаанд, ёбед.

Дополнительная информация