30/09/2018, 16:12

[Wiki] Các hàm xử lý chuỗi thông dụng trong C/C++

Mình xin thảo luận về công dụng của các hàm thường sử dụng trong chuỗi:

Chú ý khi sử dụng các hàm này ta phải khai báo thư viện #include "string.h"

1.Hàm strcpy:

  • Công dụng: sao chép chuỗi nguồn vào chuỗi đích.

  • Cấu trúc:

char*strcpy(char *dich, char *nguon);

Có nghĩa là khi ta nhập vào một dãy các kí tự ở chuỗi nguồn thì nó sẽ sao chép tất cả các kí tự vừa nhập vào cái chuỗi đích.

  • ví dụ như sau:
#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char A[255],B[255];
    printf("Nhap chuoi: ");
    gets(A);
    strcpy(B,A);
    printf("Chuoi dich: ");
    puts(B);
    getch();
    return 0;
}

Chương trình trên khi ta nhập vào mảng A một dãy các kí tự là “abc” thì khi gap hàm strcpy(B,A); thì nó sẽ copy 3 kí tự “abc” từ mảng A vào mảng B.

Nếu chúng ta muốn copy n kí tự từ chuỗi nguồn vào chuỗi đích ta dùng hàm sau:

2.Hàm strncpy:

  • Công dụng: sao chép n kí tự đầu tiên của chuỗi nguồn vào chuỗi đích.

  • Cấu trúc:

char *strncpy(char *dich, char *nguon,int n);

3.Hàm strlen:

  • Công dụng :cho biết độ dài của chuỗi s

  • Cấu trúc:

int strlen(char *s)
  • Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.
#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char Chuoi[255];
    int Dodai;
    printf("Nhap chuoi: ");
    gets(Chuoi);
    Dodai = strlen(Chuoi);
    printf("Chuoi vua nhap:");
    puts(Chuoi);
    printf("Co do_dai
           %d",Dodai);
    getch();
    return 0;
}

4.Hàm strcat:

  • Công dụng: ghép chuỗi nguồn vào sau chuỗi đích.

  • Cấu trúc:

char *strcat(char *dich,char *nguon)
  • Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.
#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char HoLot[30], Ten[12];
    printf("Nhap Ho Lot: ");
    gets(HoLot);
    printf("Nhap Ten: ");
    gets(Ten);
    strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
    printf("Ho ten la: ");
    puts(HoLot);
    getch();
    return 0;
}

5.Hàm strncat:

  • Công dụng: ghép n kí tự đầu tiên của chuỗi vào sau chuỗi đích

  • Cấu trúc:

char *strncat(char *dich,char *nguon,int n);

6.Hàm strcmp:

  • Công dụng: so sánh 2 chuỗi s1 và s2

  • Cấu trúc:

int strcmp(char *s1,char *s2);

Hàm sẽ trả về 1 trong các giá trị sau:

  • Giá trị âm
    nếu chuỗi s1 nhỏ hơn chuỗi s2

  • Giá trị 0 nếu
    hai chuỗi bằng nhau

  • Giá trị dương nếu chuỗi s1 lớn hơn chuỗi s2

Ví dụ:

char *chu1 = "aaa", *chu2= "bbb", *chu3 = "aaa"; 
strcmp(chu1, chu2); //kết quả trả về - 1 
strcmp(chu1, chu3); //kết quả trả về 0 
strcmp(chu2, chu3); //kết quả trả về 1 

ví dụ minh họa đây:
/*
Nhap danh sach ten va sap xep theo thu tu tang dan*/ 

#include <stdio.h>

#include <conio.h>

#include <string.h>

#define MAXNUM 5

#define MAXLEN 10

int main(void)

{

char ten[MAXNUM][MAXLEN]; //mang chuoi

char *c[MAXNUM]; //mang con tro tro den chuoi

char *ct;

int i, j, n = 0;

//nhap danh sach ten

while (n < MAXNUM)

{

printf("Nhap vao ten nguoi thu %d: ",n + 1);

gets(ten[n]);

c[n++] = ten[n]; //con tro den ten

}

//sap xep danh sach theo thu tu tang dan

for (i = 0; i < n - 1; i ++)

for (j = i + 1; j < n; j ++)

if (strcmp(c[i], c[j]) > 0)

{

ct = c[i];

c[i] = c[j];

c[j] = ct;

}

//In danh sach da sap xep

printf("Danh sach sau khi sap xep:
");

for (i = 0; i < n; i ++)

printf("Ten nguoi thu %d : %s
", i + 1, c[i]);

getch();

}

7.Hàm strlwr:

  • Công dụng: chuyển tất cả các kí tự chuỗi về chữ thường

  • Cấu trúc:

char *strlwr(char *s);

8.Hàm strupr :

  • Công dụng: chuyển tất cả các kí tự chuỗi thường về chữ hoa

  • Cấu trúc:

char *strupr(char *s)
  • Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm strupr(); để chuyển đổi chúng thành chuỗi chữ hoa.
#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char Chuoi[255],*s;
    printf("Nhap chuoi: ");
    gets(Chuoi);
    s=strupr(Chuoi) ;
    printf("Chuoi chu hoa:");
    puts(s);
    getch();
    return 0;
}

9.Hàm strrev :

  • Công dụng: đảo ngược chuỗi kí tự

  • Cấu trúc:

char *strrev(char *s);

10.Hàm strchr:

  • Công dụng: trả về địa chỉ vị trí xuất hiện đầu tiên của kí tự ch trong chữ s và sẽ trả về giá trị
    NULL trong trường hợp không tìm thấy.

  • Cấu trúc:

char *strchr(char *s,int ch);

11.Hàm strrchr:

  • Cấu trúc:
char *strrchr(char *s,char ch);
  • Công dụng: trả về địachỉ vị trí xuất hiện cuối cùng của kí tự ch trong chuỗi s. Nếu không tìm thấy hàm sẽ trả về giá trị NULL

12.Hàm strstr:

  • Công dụng: trả về địa chỉ vị trí xuất hiện đầu tiên của chuỗi s1 trong chuỗi s và sẽ trả về giá trị NULL trong trường hợp không tìm thấy.

  • Cấu trúc:

char *strstr(char *s, char *s1);

Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”.

#include<conio.h>
#include<stdio.h>
#include<string.h>

int main()
{
    char Chuoi[255],*s;
    printf("Nhap chuoi: ");
    gets(Chuoi);
    s=strstr(Chuoi,"hoc");
    printf("Chuoi trich ra:");
    puts(s);
    getch();
    return 0;
}

13. Hàm memset

  • Công dụng: Set num byte nhớ từ vị trí được trỏ tới bằng giá trị value

  • Cấu trúc:

void *memset (void *ptr, int value, size_t num);

14. Hàm memcpy

  • Công dụng: Chép num byte từ vị trí mà source trỏ tới đến vị trí mà destination trỏ tới

  • Cấu trúc:

void *memcpy (void *destination, const void *source, size_t num);

15. Hàm memcmp

  • Công dụng: So sánh giá trị các vùng nhớ mà ptr1 và ptr2 trỏ tới theo từng byte, sẽ dừng lại khi so sánh đủ num byte. Trả về -1 khi byte đầu tiên mà không trùng nhau của 2 vùng so sánh của ptr1 nhỏ hơn ptr2, trả về 0 khi 2 vùng nhớ bằng nhau, trả về 1 khi byte đầu tiên mà không trùng nhau của 2 vùng so sánh của ptr1 lớn hơn ptr2

  • Cấu trúc:

int memcmp(const void *ptr1, const void *ptr2, size_t num);

16.Hàm stricmp:

  • Công dụng : So sánh 2 chuỗi không phân biệt chữ hoa chữ thường , hàm trả về tương tự strcmp.
  • Cấu trúc :
int stricmp (const char * string1, const char * string2);
  • Ví dụ:
Ví dụ này sử dụng stricmp () để so sánh hai chuỗi.
#include <stdio.h> 
#include <string.h> 
int main (void) 
{ 
   / * So sánh hai chuỗi như là chữ thường * / 
   if (0 == stricmp ( "hello", "Hello")) 
    if (0 == stricmp("hello", "HELLO"))
      printf("The strings are equivalent.
");
   else
      printf("The strings are not equivalent.
");
   return 0;
}

The output:
" The strings are equivalent."

Có gì sai sót mọi người xin đóng góp ý kiến nhá bấm vào cây bút Wiki để sửa nhé

Thực tế khắc nghiệt viết 18:24 ngày 30/09/2018

cứ như thế này thiếu j tài nguyên cơ chứ a @ltd ?! cái bài này ví dụ lên để trong markdown. còn nữa mình giải thích cách dùng hạn chế post code thừa! như vật thì dễ hơn đối với người xem và người viết

passion viết 18:18 ngày 30/09/2018

mình làm cũng chưa hoàn chỉnh lắm nhờ các bạn đóng góp thêm

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

@quanpham ơi, em dùng Markdown để post code nhé

Làm sao để có thể hiển thị syntax highlighting bằng markdown? Các bạn phải đánh dấu ``` như ví dụ dưới đây Chú ý, dấu ``` được tạo ra bởi nút nằm bên trái số 1 trên bàn phím, nút này sẽ là ~ khi bấm giữ Shift Ví dụ cho C Nội dung: ``` void main() { } ``` Và đừng quên ``` ở cuối Kết quả void main() { } Ví dụ cho Pascal Nội dung: ``` Program HelloWorld; Begin WriteLn('Hello world!') {no ";" is required after the last statement of a block - adding one adds a "null stateme…

P/S: Em làm rất tốt, cố gắng chỉnh sửa sao cho hoàn chỉnh là được.

@Honey_moon em cũng bắt tay vào làm Open Source đi chứ

passion viết 18:23 ngày 30/09/2018

hi hèn gì em viết code mãi mak k dc hi

Nguyễn Minh Dũng viết 18:18 ngày 30/09/2018

Em có thể sửa bài bằng cách

Bấm vào hình cây bút bạn sẽ sửa được bài [image]

P/S: @quanpham em có muốn bài viết của em trở thành Wiki không? Nếu nó là Wiki thì ai cũng có thể sửa đổi và làm cho nó tốt hơn. Anh mới sửa 1 ít, nhưng anh nghĩ nhiều người khác cùng sửa thì nhanh hơn.

Việc đổi sang Wiki post hay không là ý của em. Nhưng chuyển sang Wiki Post có nghĩa là open source, ai cũng có thể xem và sửa. Em có muốn Open Source bài viết của mình không?

passion viết 18:22 ngày 30/09/2018

m có muốn Open Source bài viết của mình không?

được chứ em đăng bài là để mọi người xem mak hi

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

I moved 2 posts to a new topic: Xin được cấp quyền điều chỉnh Wiki Post

Nguyễn Minh Dũng viết 18:15 ngày 30/09/2018

Thở không ra hơi luôn, sửa cái bài của @quanpham mệt quá. Em coi lại cách trình bày nhé, anh sửa quá chừng sửa. Nhìn vào history đi

Bài này vẫn còn thiếu ví dụ, ai có ví dụ thì điền thêm vào nhé. Sử dụng tính năng Wiki Post ai cũng có thể sửa bài cả.

Nguyễn Đình Dũng viết 18:13 ngày 30/09/2018

A Đạt ơi, a nên sửa lại cái quyền edit wiki đi. Chứ ai cũng edit đc thì loạn lắm
E chỉ vào cái edit nó báo là “basic users can edit it”.
@ltd

passion viết 18:20 ngày 30/09/2018

em mới bổ sung thêm cái code nữa hi, để em tìm rồi bổ sung thêm

Nguyễn Minh Dũng viết 18:15 ngày 30/09/2018

Chứ ai cũng edit đc thì loạn lắm

Anh tin tưởng mọi người mà, có thể sau này anh chỉ cho Regular mới có quyền sửa nếu xảy ra tình trạng phá hoại. Nhưng anh tin mọi người

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

@quanpham ơi, anh nghĩ là em nên tách ra, mỗi topic chỉ nói về một hàm thôi, để sau này có ai thắc mắc về lĩnh vực gì, anh chỉ việc link tới topic đó, chứ để nhiều hàm và đặt cái tên “xử lý chuỗi thông dụng” thì khó tìm kiếm lắm.

Anh thấy @kayz làm rất tốt này.

Mình thấy nước ngoài có rất nhiều ý tưởng hay và FREE nhưng tại VN, mình thấy chúng lại phải trả tiền mới có được. Thế nên cái ý tưởng này mới nảy ra, đó là phát triển mã nguồn mở PHP. Mình sẽ ủng hộ Open Source, để OpenSource phát triển mạnh mẽ và có một cộng đồng Việt khiến ai cũng biết. Chúng ta sẽ bàn về PHP cũng như là thiết kế Web, JQuery, CSS nói chung. Các bạn sẽ cùng nhau thảo luận các hàm, phương thức, lớp hay một sản phẩm nào đó mà chính chủ là Người Việt - hàng Việt chất lượng …

Cả @Gio nữa

passion viết 18:26 ngày 30/09/2018

em hiểu ý anh rồi . có nghĩa mình làm mỗi hàm mỗi cái topic phải không @ltd

Đinh Quốc Hân viết 18:15 ngày 30/09/2018

Máy hàm nào giống nhau về chức năng có thể viết Gộp mà chẳng hạng câu lệnh lặp

Thực tế khắc nghiệt viết 18:18 ngày 30/09/2018

@quanpham ơi, anh nghĩ là em nên tách ra, mỗi topic chỉ nói về một hàm thôi, để sau này có ai thắc mắc về lĩnh vực gì, anh chỉ việc link tới topic đó, chứ để nhiều hàm và đặt cái tên “xử lý chuỗi thông dụng” thì khó tìm kiếm lắm.

topic này e để a đạt sửa và góp ý vậy! thiết nghĩ là nếu post chung thế này mai mốt cái hàm nào nó có lỗi rồi mọi ng hỏi nhốn nháo lên thì cái topic này dài loằng ngoằng như rắn bò vậy! với lại một hàm thì dễ hiểu mà còn dễ góp ý nữa chứ

bui danh nam viết 18:22 ngày 30/09/2018

quá hay luôn
cảm ơn bác nhiều

Hoang Tuan viết 18:22 ngày 30/09/2018

kiểu wchar_t có hỗ trợ hàm cắt xâu ko mọi người

Nguyễn Minh Dũng viết 18:18 ngày 30/09/2018

hàm cắt xâu

Hàm này tên là gì trong C?

Khang viết 18:15 ngày 30/09/2018

Có dòng char *s;
Vậy dấu * đằng sau s để làm gì ?

BX136 viết 18:22 ngày 30/09/2018
  • đằng sau s để làm gì

nó là con trỏ

Bài liên quan
0