Skip to content

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.

c
char s[] = "Hello";  // {'H','e','l','l','o','\0'}

\0 — null terminator, string oxirini bildiradi.

2. string.h — barcha funksiyalar

c
#include <string.h>
FunksiyaVazifa
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

c
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.

c
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

c
char dst[10];
strcpy(dst, "Hello");        // OK
strcpy(dst, "Hello World");  // BUFFER OVERFLOW

strncpy(dst, "Hello World", 9);
dst[9] = '\0';  // strncpy \0 qo'shmaydi

strcpy xavfli

Doim strncpy yoki snprintf ishlating.

5. strcat

c
char str[100] = "Hello ";
strcat(str, "World");
// str = "Hello World"

Hajmga e'tibor: dst yetarli bo'lsin.

c
char str[5] = "Hi ";
strcat(str, "World");  // BUFFER OVERFLOW!

6. strcmp natijasi

c
int n = strcmp("abc", "abd");
// n < 0 (c < d, alifboda)

int n = strcmp("abc", "abc");
// n == 0

int n = strcmp("abd", "abc");
// n > 0

Aniq qiymat — implementatsiyaga bog'liq. Faqat belgi muhim.

c
if (strcmp(a, b) == 0) {
    // teng
}

7. strchr va strstr

c
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

c
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
orange

strtok 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

c
size_t my_strlen(const char *s) {
    size_t len = 0;
    while (*s != '\0') {
        len++;
        s++;
    }
    return len;
}

my_strcpy

c
char *my_strcpy(char *dst, const char *src) {
    char *start = dst;
    while ((*dst++ = *src++) != '\0');
    return start;
}

my_strcat

c
char *my_strcat(char *dst, const char *src) {
    char *start = dst;
    while (*dst != '\0') dst++;
    while ((*dst++ = *src++) != '\0');
    return start;
}

my_strcmp

c
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

c
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

c
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)

c
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)

c
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).

c
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

c
#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:

c
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:

c
char input[] = "Akmal 22 Toshkent";
char name[50], city[50];
int age;
sscanf(input, "%s %d %s", name, &age, city);

17. snprintf — xavfsiz print

c
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 = 3

Algoritm — 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:

c
char text[] = "Bu matn 5 ta so'z";
int n = count_words(text);  // 5

4 — 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:

c
int count_substring(const char *s, const char *sub);

Misol: "abababab" da "ab" — 4 marta.

7 — Tokenize

tokenize.cstrtok bilan:

c
char data[] = "Akmal,22,Toshkent,Talaba";
// 4 ta token: Akmal, 22, Toshkent, Talaba

8 — 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
c
void caesar_encrypt(char *s, int shift);
void caesar_decrypt(char *s, int shift);
void caesar_bruteforce(const char *s);

10 — GitHub

bash
$ mkdir 5-oy-dars-8
$ git add . && git commit -m "feat: dars 8 - strings deep" && git push

Lug'at

TerminIzoh
string.hString funksiyalari header
strlenUzunlik
strcpy / strncpyNusxalash
strcat / strncatQo'shish
strcmp / strncmpTaqqoslash
strchr / strstrTopish
strtokBo'lish
memset / memcpyMemory functions
snprintfXavfsiz print
fgetsQator olish
AnagramBir xil harflar bilan
Edit distanceLevenshtein masofa

Keyingi dars

9-dars: Struct asoslari →

Master IT o'quv markazi — o'qitish rejasi