Печать
Категория: C++
Просмотров: 873

Дар 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); 

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

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

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

int strcmpi(const char *s1, const char *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() истифода шудааст.

Як мисоли дигар:

#include <string>
#include <iostream>
using namespace std;

int main() {
setlocale(0,"");
string s = "";
int n,i,k=0;
getline(cin, s);
cout << "You entered: " << s << endl;
n = s.length();
cout<<"String's length: "<<n<<endl;
for(i=0;i<n;i++)
if(s[i]=='l' || s[i]=='L')
k++;
cout<<"Number of l's in your input: "<<k<<endl;
system("pause");
return 0;
}

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