Скачиваний:
0
Добавлен:
20.09.2026
Размер:
260 Кб
Скачать
☆
10-lekciya. Qatarlar hám keńeytilgen belgiler. Char tipindegi qatarlar haqqında
ulıwma túsinik. Qatar standart funkciyaları hám olar járdeminde qatarlardı qayta
islew.
Joba:
1. Kirisiw: C++ tilinde qatarlar (strings)
2. C stilindegi qatarlar: char tipindegi massivler
3. Qatar standart funkciyaları (<cstring> kitapxanası)
5. C stilindegi qatarlardıń kemshilikleri hám std::string klasına kirisiw
1. Kirisiw: C++ tilinde qatarlar (strings)
Programmalastırıwda sanlı maǵlıwmatlar menen bir qatarda tekstli maǵlıwmatlar menen islewge de kóp tuwra keledi. Mısalı, paydalanıwshınıń atı, adresi, xabar tekstleri hám basqalar. Bunday tekstli maǵlıwmatlar programmalastırıwda qatar (string) dep ataladı. Qatar – bul belgilerdiń (simvollardıń) izbe-izligi.
C++ tilinde qatarlar menen islewdiń tiykarǵı eki usılı bar:
1. C stilindegi qatarlar: Bul C tilinen miyras bolıp qalǵan usıl bolıp, char tipindegi
bir ólshemli massivler arqalı ámelge asırıladı.
2. std::string klası: Bul C++ standart kitapxanasınıń bir bólimi bolıp, qatarlar
menen islew ushın qolaylı hám qáwipsizlew interfeysti usınadı.
C stilindegi qatarlar: char tipindegi massivler
C stilindegi qatar – bul aqırında arnawlı bir belgi – null-terminator (\0) menen tamamlanatuǵın char tipindegi massiv. Usı \0 belgisi qatardıń qayerde tamamlanıwın bildiredi.
Járiyalaw hám inicializaciyalaw
C stilindegi qatardı járiyalaw ádettegi massivti járiyalawǵa uqsas, biraq onıń kólemi saqlanatuǵın belgiler sanı hám qosımsha \0 belgisi ushın jetkilikli bolıwı
kerek.
#include <iostream>
int main() {
// 1-usıl: Kólemdi kórsetip // "Hello" sózi 5 belgiden ibarat, biraq qatar ushın 6 orın kerek
(5 + 1 ('\0' ushın))
char str1[6] = "Hello";
// 2-usıl: Kompilyator kólemdi avtomat anıqlaydı char str2[] = "Sálem Álem!"; // Kólem 12 ge teń boladı (11 belgi +
'\0')
// 3-usıl: Hárbir belgini kórsetiw arqalı // Bul jaǵdayda '\0' belgisin ózińiz qosıwıńız shárt! char str3[4] = {'C', '+', '+', '\0'};
std::cout << str1 << std::endl; std::cout << str2 << std::endl; std::cout << str3 << std::endl;
return 0; }
Esletpe: char arr[5] = "Hello"; dep járiyalaw qáte boladı, sebebi \0 belgisine orın qalmadı. Bul programmanıń nadurıs islewine alıp keliwi múmkin.
Qatarlardı kirgiziw-shıǵarıw
Qatarlardı konsolǵa shıǵarıw ushın cout obyektinen paydalanıw múmkin. Ol \0 belgisin ushıratqanǵa shekem barlıq belgilerdi shıǵaradı.
Qatarlardı kirgiziw ushın cin obyektin qollanıw múmkin, biraq onıń bir kemshiligi bar: cin birinshi probeldi (bos orındı) ushıratqanǵa shekem belgilerdi oqıydı.
#include <iostream>
int main() {
char at[20]; std::cout << "Atıńızdı kirgiziń: "; std::cin >> at; // Eger "Ali Nuriev" dep kirgizilse, tek "Ali"
oqıladı
std::cout << "Sálem, " << at << "!" << std::endl; return 0; }
Probel menen ajıratılǵan tolıq qatardı oqıw ushın cin.getline() funkciyasınan paydalanǵan maqul.
#include <iostream>
int main() {
char toliq_at[50]; std::cout << "Tolıq atıńızdı kirgiziń: "; // cin.getline(qatardı saqlawshı massiv, maksimal belgiler sanı) std::cin.getline(toliq_at, 50); std::cout << "Xosh kelipsiz, " << toliq_at << "!" << std::endl; return 0; }
Qatar standart funkciyaları (<cstring> kitapxanası)
C++ tilinde C stilindegi qatarlar menen islesiwdi ańsatlastırıw ushın <cstring> (yamasa C tilinde <string.h>) baslı faylında (header file) bir qatar paydalı funkciyalar anıqlanǵan.
a) strlen() – qatar uzınlıǵın anıqlaw
Bul funkciya qatardaǵı belgiler sanın (\0 di esapqa almaǵan jaǵdayda) qaytaradı.
Sintaksisi: size_t strlen(const char *str);
#include <iostream> #include <cstring>
int main() {
char text[] = "C++ tili"; int uzinliq = strlen(text); std::cout << "Qatar: " << text << std::endl; std::cout << "Uzınlıǵı: " << uzinliq << std::endl; // Natiyje: 8 return 0; }
b) strcpy() – qatardı kopiyalaw (nusqalaw)
Bir qatardıń mazmunın ekinshisine kopiyalaydı.
Sintaksisi: char *strcpy(char *destination, const char *source);
#include <iostream> #include <cstring>
int main() {
char derek[] = "Original tekst"; char nusqa[20];
strcpy(nusqa, derek); // 'derek' qatarı 'nusqa' massivine
kopiyalanadı
std::cout << "Derek qatarı: " << derek << std::endl; std::cout << "Kopiyalanǵan qatar: " << nusqa << std::endl; return 0; }
Itibar beriń: destination (maqset) massivi source (derek) qatarın sıydıratuǵın dárejede úlken bolıwı shárt, keri jaǵdayda yadda buferdiń tolıp ketiwi (buffer overflow) júz beredi.
c) strcat() – qatarlardı birlestiriw (konkatenaciya)
Bir qatardı ekinshi qatardıń aqırına qosadı.
Sintaksisi: char *strcat(char *destination, const char *source);
#include <iostream> #include <cstring>
int main() {
char str1[50] = "Sálem, "; char str2[] = "Álem!";
strcat(str1, str2); // str2 qatarı str1 diń aqırına qosıladı
std::cout << str1 << std::endl; // Natiyje: Sálem, Dúnya! return 0; }
Itibar beriń: destination massiviniń kólemi eki qatardıń ulıwma uzınlıǵı hám \0 ushın jetkilikli bolıwı kerek.
d) strcmp() – qatarlardı salıstırıw
Eki qatardı leksikografiyalıq (alfavitlik) tártipte salıstıradı.
Sintaksisi: int strcmp(const char *str1, const char *str2);
Qaytaratuǵın mánisleri:
0: eger str1 hám str2 teń bolsa. < 0 (teris san): eger str1 qatarı str2 den alfavit boyınsha aldın kelse. > 0 (oń san): eger str1 qatarı str2 den keyin kelse.
#include <iostream> #include <cstring>
int main() {
char pass1[] = "secret"; char pass2[] = "secret"; char pass3[] = "password";
if (strcmp(pass1, pass2) == 0) { std::cout << "pass1 hám pass2 birdey" << std::endl; }
if (strcmp(pass1, pass3) != 0) { std::cout << "pass1 hám pass3 parıqlanadı" << std::endl; } return 0; }
e) strstr() – qatar ishinen qatar izlew
Bir qatardıń ishinen ekinshi qatardıń (qatar-astı) birinshi ushırasqan jerin izleydi.
Sintaksisi: char *strstr(const char *haystack, const char *needle);
Eger needle (iyne) qatarı haystack (shóp dástesi) ishinen tabılsa, tabılǵan jerge kórsetkish qaytaradı. Eger tabılmasa, NULL qaytaradı.
#include <iostream> #include <cstring>
int main() {
char text[] = "C++ programmalastırıw tili"; char izlew[] = "programma"; char *natiyje;
natiyje = strstr(text, izlew);
if (natiyje != NULL) { std::cout << "'" << izlew << "' qatarı tómendegi poziciyadan
baslanadı: "
<< natiyje - text << std::endl; } else { std::cout << "'" << izlew << "' qatarı tabılmadı." <<
std::endl;
} return 0; }
f) strchr() – qatar ishinen belgini izlew
Qatar ishinen berilgen belginiń birinshi ushırasqan jerin tabadı.
Sintaksisi: char *strchr(const char *str, int character);
#include <iostream> #include <cstring>
int main() {
char email[] = "test@example.com"; char belgi = '@'; char *natiyje;
natiyje = strchr(email, belgi);
if (natiyje != NULL) { std::cout << "'" << belgi << "' belgisi tabıldı." <<
std::endl;
std::cout << "Tabılǵan jerden keyingi qatar: " << natiyje <<
std::endl;
} return 0; }
4. Keńeytilgen belgiler (wchar_t)
char tipi ádette 1 bayt orın aladı hám 256 túrli belgini (ASCII standartı) saqlay
aladı. Biraq bul dúnyadaǵı barlıq álipbelerdi (mısalı, qıtay, yapon, arab, kirill hám t.b. álipbelerin) sáwlelendiriw ushın jetkiliksiz.
Bul máseleni sheshiw ushın C++ wchar_t (wide character type – keńeytilgen belgi tipi) tipin usınadı. Ol ádette 2 yamasa 4 bayt bolıp, Unicode sıyaqlı keń kólemli belgiler toplamın qollap-quwatlay aladı.
wchar_t tipindegi qatarlar L prefiksi menen jazıladı hám olar menen islew ushın <cwchar> kitapxanasında sáykes funkciyalar (wcslen, wcscpy hám t.b.) bar.
#include <iostream>
int main() {
wchar_t wstr[] = L"Qaraqalpaqsha tekst"; // Standart 'cout' obyekti keńeytilgen belgilerdi durıs shıǵara
almawı múmkin.
// Olar ushın 'wcout' qollanıladı. std::wcout << wstr << std::endl; return 0; }
C stilindegi qatarlardıń kemshilikleri hám std::string klasına kirisiw
C stilindegi qatarlar kúshli hám tez islese de, olar menen islesiwde bir qatar qáwip hám qolaysızlıqlar bar:
Yad penen islesiw: Massiv kólemin aldınnan anıq belgilew kerek. Kólem jetpey
qalsa yamasa artıqsha orın ajıratılsa, programma natiyjeliligi tómenleydi.
Buferdiń tolıp ketiwi (Buffer Overflow): strcpy yamasa strcat funkciyaları
maqset massiviniń shegarasın teksermeydi. Bul qáwipsizlik máselerine alıp keliwi múmkin.
Qolaysızlıq: Ápiwayı ámeller (mısalı, qosıw, salıstırıw) ushın arnawlı
funkciyalardı shaqırıw kerek. = yamasa + operatorların tikkeley qollanıp bolmaydı.
Usı kemshiliklerdi joq etiw ushın C++ tilinde <string> kitapxanasındaǵı
std::string klası jaratılǵan. Ol yad basqarıwın avtomatlastıradı, qáwipsizlew hám
qatarlar menen islewdi ádewir ańsatlastıradı.
#include <iostream> #include <string> // string klası ushın baslıq fayl
int main() {
// std::string obyektin jaratıw std::string s1 = "Sálem"; std::string s2 = "Álem"; std::string s3;
// Birlestiriw (+) operatorı menen s3 = s1 + ", " + s2 + "!"; std::cout << s3 << std::endl;
// Uzınlıǵın tabıw (.length() yamasa .size() metodı) std::cout << "Qatar uzınlıǵı: " << s3.length() << std::endl;
// Salıstırıw (== operatorı menen)
if (s1 == "Sálem") { std::cout << "Qatarlar teń." << std::endl; }
return 0; }
Соседние файлы в папке 1-semestr