8-dars: String — chuqur o'rganish
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba string.h funksiyalarini chuqur o'rganishi, o'z string funksiyalarini yozishi va string algoritmlari bilan ishlay olishi kerak.
1. String — quick reminder
String = char massivi + \0.
char s[] = "Hello"; // {'H','e','l','l','o','\0'}\0 — null terminator, string oxirini bildiradi.
2. string.h — barcha funksiyalar
#include <string.h>| Funksiya | Vazifa |
|---|---|
strlen(s) | Uzunlik |
strcpy(dst, src) | Nusxa olish |
strncpy(dst, src, n) | n belgi |
strcat(dst, src) | Qo'shish |
strncat(dst, src, n) | n belgi qo'shish |
strcmp(s1, s2) | Taqqoslash |
strncmp(s1, s2, n) | n belgi taqqoslash |
strchr(s, c) | Belgini topish |
strrchr(s, c) | Oxirgi belgini topish |
strstr(s, sub) | Substring topish |
strtok(s, delim) | Bo'lish |
memset(s, c, n) | n belgini c bilan to'ldirish |
memcpy(dst, src, n) | n byte nusxa olish |
3. strlen — chuqur
size_t strlen(const char *s) {
size_t len = 0;
while (s[len] != '\0') len++;
return len;
}size_t — unsigned int (manfiy emas).
Tezligi: O(n) — har safar oxirigacha o'tadi.
for (int i = 0; i < strlen(str); i++) { // SEKIN!
// strlen har iteration'da hisoblanadi
}
int len = strlen(str);
for (int i = 0; i < len; i++) { // TEZ
// bir marta hisoblandi
}4. strcpy va strncpy
char dst[10];
strcpy(dst, "Hello"); // OK
strcpy(dst, "Hello World"); // BUFFER OVERFLOW
strncpy(dst, "Hello World", 9);
dst[9] = '\0'; // strncpy \0 qo'shmaydistrcpy xavfli
Doim strncpy yoki snprintf ishlating.
5. strcat
char str[100] = "Hello ";
strcat(str, "World");
// str = "Hello World"Hajmga e'tibor: dst yetarli bo'lsin.
char str[5] = "Hi ";
strcat(str, "World"); // BUFFER OVERFLOW!6. strcmp natijasi
int n = strcmp("abc", "abd");
// n < 0 (c < d, alifboda)
int n = strcmp("abc", "abc");
// n == 0
int n = strcmp("abd", "abc");
// n > 0Aniq qiymat — implementatsiyaga bog'liq. Faqat belgi muhim.
if (strcmp(a, b) == 0) {
// teng
}7. strchr va strstr
char str[] = "Hello World";
char *p = strchr(str, 'W');
// p ko'rsatadi 'W' ga
// p == str + 6
printf("%s\n", p); // "World"
char *p2 = strstr(str, "World");
// p2 == str + 6
char *p3 = strstr(str, "xyz");
// p3 == NULL (topilmadi)8. strtok — bo'lish
char str[] = "apple,banana,orange";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ","); // ikkinchidan boshlab — NULL
}Natija:
apple
banana
orangestrtok original'ni o'zgartiradi
strtok — , o'rniga \0 qo'yadi. Original string buziladi.
Kerakli bo'lsa — nusxa oling.
9. O'zingizning string funksiyalaringiz
my_strlen
size_t my_strlen(const char *s) {
size_t len = 0;
while (*s != '\0') {
len++;
s++;
}
return len;
}my_strcpy
char *my_strcpy(char *dst, const char *src) {
char *start = dst;
while ((*dst++ = *src++) != '\0');
return start;
}my_strcat
char *my_strcat(char *dst, const char *src) {
char *start = dst;
while (*dst != '\0') dst++;
while ((*dst++ = *src++) != '\0');
return start;
}my_strcmp
int my_strcmp(const char *s1, const char *s2) {
while (*s1 && (*s1 == *s2)) {
s1++;
s2++;
}
return *(unsigned char*)s1 - *(unsigned char*)s2;
}10. String reverse
void reverse(char *s) {
int len = strlen(s);
for (int i = 0; i < len / 2; i++) {
char temp = s[i];
s[i] = s[len - 1 - i];
s[len - 1 - i] = temp;
}
}
// Yoki pointer bilan:
void reverse(char *s) {
char *end = s;
while (*end) end++;
end--;
while (s < end) {
char t = *s;
*s = *end;
*end = t;
s++;
end--;
}
}11. So'z sanash
int count_words(const char *s) {
int count = 0;
int in_word = 0;
while (*s) {
if (*s == ' ' || *s == '\t' || *s == '\n') {
in_word = 0;
} else if (!in_word) {
in_word = 1;
count++;
}
s++;
}
return count;
}12. Substring topish (manual)
char *my_strstr(const char *haystack, const char *needle) {
if (*needle == '\0') return (char*)haystack;
while (*haystack) {
const char *h = haystack;
const char *n = needle;
while (*h && *n && *h == *n) {
h++;
n++;
}
if (*n == '\0') return (char*)haystack;
haystack++;
}
return NULL;
}13. Palindrome (string)
int is_palindrome(const char *s) {
int len = strlen(s);
for (int i = 0; i < len / 2; i++) {
if (tolower(s[i]) != tolower(s[len - 1 - i])) {
return 0;
}
}
return 1;
}14. Anagram tekshirish
Anagram — bir xil harflar bilan tuzilgan ikki so'z (listen va silent).
int is_anagram(const char *s1, const char *s2) {
if (strlen(s1) != strlen(s2)) return 0;
int count[256] = {0};
while (*s1) {
count[(unsigned char)*s1]++;
s1++;
}
while (*s2) {
count[(unsigned char)*s2]--;
if (count[(unsigned char)*s2] < 0) return 0;
s2++;
}
return 1;
}15. String massivi sort
#include <string.h>
void sort_strings(char arr[][50], int n) {
char temp[50];
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (strcmp(arr[j], arr[j+1]) > 0) {
strcpy(temp, arr[j]);
strcpy(arr[j], arr[j+1]);
strcpy(arr[j+1], temp);
}
}
}
}
int main(void) {
char names[][50] = {"Botir", "Akmal", "Dilshod", "Aziza"};
sort_strings(names, 4);
for (int i = 0; i < 4; i++) {
printf("%s\n", names[i]);
}
return 0;
}16. fgets va sscanf
scanf("%s", ...) — bo'shliqgacha o'qiydi.
To'liq qator uchun — fgets:
char buffer[100];
fgets(buffer, sizeof(buffer), stdin);
// buffer'da \n bor!
// \n ni olib tashlash
buffer[strcspn(buffer, "\n")] = '\0';Keyin sscanf bilan tahlil:
char input[] = "Akmal 22 Toshkent";
char name[50], city[50];
int age;
sscanf(input, "%s %d %s", name, &age, city);17. snprintf — xavfsiz print
char buffer[100];
snprintf(buffer, sizeof(buffer), "Yosh: %d, Ism: %s", 22, "Akmal");Buffer'ga xavfsiz yozadi (overflow yo'q).
18. Edit distance — kirish
Edit distance (Levenshtein) — bir so'zni boshqasiga aylantirish uchun nechta o'zgartirish kerak.
"kitten" → "sitting"
1. kitten → sitten (k → s)
2. sitten → sittin (e → i)
3. sittin → sitting (qo'shish)
Edit distance = 3Algoritm — keyingi darslarda.
Darsdagi topshiriqlar
1 — String funksiyalar
string-fn.c — Dars matnidagi barcha my_* funksiyalarini yozing va sinab ko'ring.
2 — Reverse
reverse.c — 2 ta versiya: index bilan va pointer bilan.
3 — Word counter
word-count.c:
char text[] = "Bu matn 5 ta so'z";
int n = count_words(text); // 54 — Palindrome
palindrome.c — string uchun (bo'shliq va katta-kichik harflarni e'tiborsiz).
5 — Anagram
anagram.c — 2 ta so'z anagramami?
Sinab ko'ring:
- listen, silent → Ha
- hello, world → Yo'q
- evil, vile → Ha
6 — Substring count
count-substr.c:
int count_substring(const char *s, const char *sub);Misol: "abababab" da "ab" — 4 marta.
7 — Tokenize
tokenize.c — strtok bilan:
char data[] = "Akmal,22,Toshkent,Talaba";
// 4 ta token: Akmal, 22, Toshkent, Talaba8 — String sort
string-sort.c — ismlar massivini alfabit bo'yicha.
9 — Caesar cipher (yana)
4-oydagi Caesar'ni yaxshilang:
- Decryption funksiyasi
- Brute force (har shift sinab)
- Case sensitive
void caesar_encrypt(char *s, int shift);
void caesar_decrypt(char *s, int shift);
void caesar_bruteforce(const char *s);10 — GitHub
$ mkdir 5-oy-dars-8
$ git add . && git commit -m "feat: dars 8 - strings deep" && git pushLug'at
| Termin | Izoh |
|---|---|
| string.h | String funksiyalari header |
| strlen | Uzunlik |
| strcpy / strncpy | Nusxalash |
| strcat / strncat | Qo'shish |
| strcmp / strncmp | Taqqoslash |
| strchr / strstr | Topish |
| strtok | Bo'lish |
| memset / memcpy | Memory functions |
| snprintf | Xavfsiz print |
| fgets | Qator olish |
| Anagram | Bir xil harflar bilan |
| Edit distance | Levenshtein masofa |