Các hàm xử lý chuỗi trong x

Rút trích một chuỗi con với chiều dài y bắt đầu tại vị trí x. Nếu không có y, một chuỗi con từ vị trí x tới cuối chuỗi sẽ được rút trích.

string s1 = "introduction to programming";
cout<<"substring has 10 characters of s1 start at 5:"<<s1.substr(5, 10);
//Kết quả: substring has 10 characters of s1 start at 5:duction to

Hàm s.find(r)

Kiểm tra chuỗi string r có xuất hiện trong chuỗi s hay không. Nếu có thì trả về vị trí bắt đầu xuất hiện chuỗi r trong chuỗi s.

Buổi trước chúng ta vừa cùng nhau đi tìm hiểu về chuỗi trong C. Buổi hôm nay Lập trình không khó sẽ cùng các bạn đi tìm hiểu một thư viện hỗ trợ rất nhiều hàm để làm việc với chuỗi – đó là thư viện string.h, và chúng ta sẽ cùng nhau đi tìm hiểu lần lượt các hàm trong thư viện string.h nhé.

NỘI DUNG BÀI VIẾT

  • Thư viện string.h trong C
  • Các hàm trong thư viện string.h
    • Hàm strlen – hàm lấy chiều dài chuỗi
    • Hàm strcmp – hàm so sánh 2 chuỗi
    • Hàm strcat – hàm nối chuỗi
    • Hàm strcpy – hàm copy chuỗi
    • Hàm strlwr – Đưa chuỗi về dạng lowercase
    • Hàm strupr – đưa chuỗi về dạng uppercase
    • Hàm strrev – hàm đảo ngược chuỗi
    • Hàm strchr – Trả về vị trí đầu tiên của ký tự cần tìm
    • Hàm strstr – hàm tìm chuỗi con trong chuỗi
  • Tài liệu tham khảo

Thư viện string.h trong C

Đây là thư viện cung cấp rất nhiều hàm hữu ích giúp các bạn thuận tiện để làm việc với chuỗi. Để sử dụng các đoạn code trong bài viết này, bạn vui lòng thêm thư viện sau:

1

#include <string.h>

Ngay sau đây, chúng ta sẽ cùng làm quen với các hàm trong thư viện string.h được sử dụng phổ biến nhé.

Các hàm trong thư viện string.h

Mình sẽ đi qua từng hàm, và mỗi hàm đều sẽ có những ví dụ cụ thể cho bạn.

Hàm strlen – hàm lấy chiều dài chuỗi

1

int strlen ( const char * str );

Vai trò: Hàm strlen trong thư viện string.h cung cấp cho bạn độ dài của chuỗi mà nó đang lưu.

Ví dụ:

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include <string.h>

 

int main(){

    char s[100];

    printf("\nNhap chuoi: ");

    fgets(s, sizeof s, stdin);

    printf("length = %d", strlen(s) - 1);

    printf("\nNhap chuoi: ");

    gets(s);

    printf("length = %d", strlen(s));

}

1

2

3

4

5

6

7

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

 

Nhap chuoi: Nguyen Van Hieu

length = 15

Nhap chuoi: Nguyen Van Hieu

length = 15

Lưu ý:

  • Chúng ta cần lấy strlen(s) - 1 là do hàm fgets() đọc cả ký tự ‘\n’. Nếu bạn dùng hàm gets() thì không cần bớt đi 1 đơn vị. Nhưng chúng ta không nên dùng hàm gets() -> lý do ở đây.

Hàm strcmp – hàm so sánh 2 chuỗi

Trong ngôn ngữ C, bạn không thể dùng dấu == để so sánh 2 chuỗi. Lý do là bởi khi bạn truy xuất tên chuỗi thì thực tế là bạn đang truy xuất tới địa chỉ của nó chứ không phải giá trị. Xem ví dụ sau:

1

2

3

4

5

6

7

8

#include <stdio.h>

#include <string.h>

 

int main(){

    char a[] = "Hieu";

    char b[] = "Hieu";

    printf("%d, %d, %d", a, b, a == b);

}

Kết quả chạy:

1

2

3

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

6487568, 6487552, 0

Bạn thấy đấy, đây là 2 địa chỉ khác nhau. Do đó, nếu bạn dùng == để so sánh thì bạn đang so sánh 2 địa chỉ chứ không phải cái bạn mong muốn đâu. Đó là lý do chúng ta cần hàm strcmp().

1

int strcmp ( const char * str1, const char * str2 );

Giá trị trả về của hàm này bạn xem trong bảng dưới đây:

Giá trị trả vềGiải thíchmột số nguyên < 0Khi ký tự đầu tiên của 2 chuỗi không giống nhau và ký tự này ở chuỗi str1 có giá trị nhỏ hơn ở chuỗi str2giá trị 0hai chuỗi giống nhaumột số nguyên strlen(s) - 10Khi ký tự đầu tiên của 2 chuỗi không giống nhau và ký tự này ở chuỗi str1 có giá trị lớn hơn ở chuỗi str2

Xem ví dụ sau đây:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#include <stdio.h>

#include <string.h>

 

int main ()

{

  char key[] = "apple";

  char buffer[80];

  do {

     printf ("Hay doan loai qua toi thich? ");

     fflush (stdout);

     scanf ("%s",buffer);

  } while (strcmp (key,buffer) != 0);

  puts ("Ban doan dung roi!");

  return 0;

}

Kết quả chạy:

1

2

3

4

PS G:\c_cources\day_57> .\StringFuntion.exe

Hay doan loai qua toi thich? orange

Hay doan loai qua toi thich? apple

Ban doan dung roi!

Hàm strcat – hàm nối chuỗi

1

char * strcat ( char * chuoi_dich, const char * chuoi_nguon);

Vai trò: Ghép chuỗi chuỗi nguồn vào phía sau chuỗi đích.

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include <string.h>

 

int main ()

{

  char str[80];

  strcpy (str,"Lap ");

  strcat (str,"trinh ");

  strcat (str,"khong ");

  strcat (str,"kho!");

  puts (str);

}

Kết quả chạy:

1

2

3

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

Lap trinh khong kho!

Hàm strcpy – hàm copy chuỗi

1

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

Vai trò: Copy giá trị của chuỗi nguồn và lưu vào chuỗi đích. Bạn cần dùng hàm này khi muốn gán giá trị của chuỗi này cho chuỗi khác thay vì sử dụng dấu strlen(s) - 11 nhé.

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

#include <string.h>

 

int main ()

{

  char str1[]="Lap trinh khong kho!";

  char str2[40];

  char str3[40];

  strcpy (str2,str1);

  strcpy (str3,"Nguyen Van Hieu");

  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);

  return 0;

}

Kết quả chạy:

1

2

3

4

5

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

str1: Lap trinh khong kho!

str2: Lap trinh khong kho!

str3: Nguyen Van Hieu

Hàm strlwr – Đưa chuỗi về dạng lowercase

1

char * strlwr(char * s);

Xem ví dụ sau đây:

1

2

3

4

5

6

7

#include<stdio.h>

#include<string.h>

int main()

{

    char str[ ] = "Lap Trinh KHONG kho!";

    printf("%s\n",strlwr (str));

}

Kết quả:

1

2

3

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

lap trinh khong kho!

Hàm strupr – đưa chuỗi về dạng uppercase

1

char * strupr (char * s)

Xem ví dụ sau:

1

2

3

4

5

6

7

#include<stdio.h>

#include<string.h>

int main()

{

    char str[ ] = "Lap Trinh KHONG kho!";

    printf("%s\n",strupr (str));

}

Kết quả:

1

2

3

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

LAP TRINH KHONG KHO!

Hàm strrev – hàm đảo ngược chuỗi

Công dụng: Đảo ngược chuỗi trong C

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

#include <string.h>

 

int main()

{

    char name[30] = "Nguyen Van Hieu";

 

    printf("Truoc khi dao nguoc : %s\n", name);

 

    printf("Sau khi dao nguoc   : %s", strrev(name));

 

    return 0;

}

Kết quả:

1

2

3

4

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

Truoc khi dao nguoc : Nguyen Van Hieu

Sau khi dao nguoc   : ueiH naV neyugN

Hàm strchr – Trả về vị trí đầu tiên của ký tự cần tìm

1

char * strchr (const char * s, char c)

Hàm này trả về con trỏ trỏ tới vị trí xuất hiện đầu tiên của ký tự strlen(s) - 12. Còn hàm thì trả về vị trí cuối cùng. Nếu không tồn tại, trả về con trỏ strlen(s) - 13.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

#include <string.h>

int main()

{

    char string[55] = "Lap trinh khong kho";

    char *first, *last;

    first = strchr(string, 'm');

    last = strrchr(string, 'k');

    if (first != NULL)

    {

        printf("Ky tu k xuat hien lan dau tai vi tri %d\n", first - string + 1);

    }

    if (last != NULL)

    {

        printf("Ky tu k xuat hien lan dau tai vi tri %d\n", last - string + 1);

    }

}

Kết quả:

1

2

3

4

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

Ky tu k xuat hien lan dau tai vi tri 11

Ky tu k xuat hien lan dau tai vi tri 17

Hàm strstr – hàm tìm chuỗi con trong chuỗi

1

char * strstr (const char * str, const char * sub)

Hàm này tìm kiếm sự xuất hiện của chuỗi con strlen(s) - 14 trong chuỗi strlen(s) - 15. Nếu không tìm thấy thì trả về con trỏ NULL. Nếu tìm thấy thì trả về con trỏ trỏ tới vị trí tìm thấy.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

#include <string.h>

    int

    main()

{

    char string[55] = "Lap trinh khong kho";

    char *first;

    first = strstr(string, "kho");

    if (first != NULL)

    {

        printf("Vi tri xuat hien dau tien cua \"kho\" trong \"%s\" la"

               " \"%s\"",

               string, first);

    }else{

        printf("Khong tim thay!\n");

    }

}

Kết quả chạy:

1

2

3

PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion

PS G:\c_cources\day_57> .\StringFuntion.exe

Vi tri xuat hien dau tien cua "kho" trong "Lap trinh khong kho" la "khong kho"

Tại sao lại là “khong kho”? Bởi vì chữ “khong” có chữ “kho”.

Trên đây là các hàm trong thư viện string.h sử dụng nhiều. Bạn có thể xem đầy đủ các hàm của thư viện string.h ở link trong tài liệu tham khảo.

Tài liệu tham khảo

  1. https://en.cppreference.com/w/cpp/header/cstring

  • TAGS
  • chuỗi trong c
  • học c bá đạo
  • khóa học lập trình C

Facebook

Twitter

Pinterest

WhatsApp

Nguyễn Văn Hiếu

Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.