So sánh 2 chuỗi string trong c strcmp năm 2024

Khi so sánh 2 số trong C thì ta có một số phép toán làm rất đơn giản <, >, >=, <=, ==, !=, tuy nhiên để so sánh chuỗi thì chúng ta không thể dùng các phép toán đó mà cần phải dùng hàm strcmp nằm trong thư viện string.h.

Hàm strcmp so sánh chuỗi s1 và chuỗi s2 và cho ta kết quả:

  • 1 Nếu s1 lớn hơn s2
  • 0 Nếu s1 giống s2
  • -1 Nếu s1 nhỏ hơn s2

Lưu ý: Trong Linux, hàm này trả về giá trị âm, dương, 0 (là khoảng cách giữa 2 ký tự khác nhau tương ứng trong s1, s2).

Ví dụ chương trình sau:

include

include

int main() {

char s1[20];
char s2[20];                
do 
{
    printf("Enter s1: ");
    gets(s1);
    printf("Enter s2: ");
    gets(s2);
    int x = strcmp(s1, s2);
    printf("x = %d", x);
    if(x < 0) printf(" => %s < %s", s1, s2);
    if(x > 0) printf(" => %s > %s", s1, s2);
    if(x == 0)printf(" => %s = %s", s1, s2);
    printf("\n\n");
} while ( strcmp(s1, s2) != 0);
return 0;
}

Kết quả:

Enter s1: Hang

Enter s2: Ho x = -1 => Hang < Ho

Enter s1: Hong Enter s2: Hon x = 1 => Hong > Hon

Enter s1: Hung Enter s2: hung x = -1 => Hung < hung

Enter s1: Quan Enter s2: Quan x = 0 => Quan = Quan

2. Nguyên tắc so sánh

Nguyên tắc so sánh 2 chuỗi đó là duyệt lần lượt 2 từng ký tự của 2 chuỗi. So sánh mã ACSII của 2 ký tự đó, mã ký tự nào lớn hơn tức là chuỗi lớn hơn và ngừng so sánh. Nếu một chuỗi nào hết ký tự để so sanh trước thì chuỗi đó bé hơn.

Hướng dẫn sử dụng hàm strlen để lấy độ dài chuỗi, hàm strcmp để so sánh hai chuỗi, hàm strcpy để copy chuỗi trong C.

String là một một mảng các ký tự được viết liền nhau, trong lập trình thường sử dụng rất nhiều để lưu chuỗi kí tự. Để thao tác với chuỗi có rất nhiều hàm và thư viện string.h hỗ trợ nhiều hàm hữu ích để xử lý chuỗi và hàm hỗ trợ xử lý mảng nhị phân.

Bài viết này chỉ đề cập đến cách hiện thực và sử dụng các hàm strlen, strcpystrcmp trong thư viện string.h hỗ trợ xử lý chuỗi.

* Chuỗi trong bài viết này đề cập đến C string char[], trong bài viết này không đề cập đến std::string trong C++.

String là gì?

String (chuỗi ký tự) là một dãy gồm các ký tự hoặc một mảng các ký tự và String được kết thúc bằng ký tự

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

0 (còn được gọi là ký tự

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

1 trong bảng mã ASCII).

Các hằng chuỗi ký tự được đặt trong cặp dấu nháy kép

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

2.

Hàm strlen()

strlen (String Length) là hàm dùng để đếm số lượng ký tự có trong mảng. Nó cho biết được kích thước của mảng.

int strlen(char a[])
{
  int n = 0;
  while (a[n] != '\0')
    n++;
  return n;
}
void main()
{
  char A[5] = "STDIO";
  int x;
  x = strlen(A);
}

LƯU Ý

Vòng lặp trong strlen sẽ dừng lại khi kiểm tra thấy ký tự trong chuỗi hiện tại là

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

0, nên:

  • Nếu chuỗi bị mất ký tự

    void main() { char A[6] = {'s', 't', 'd', '\0', 'i', 'o'}; int x = strlen(A); }

    0 thì hàm sẽ duyệt từng ký tự cho đến khi gặp được ký tự

    void main() { char A[6] = {'s', 't', 'd', '\0', 'i', 'o'}; int x = strlen(A); }

    0 thì hàm dừng lại.
  • Nếu ký tự

    void main() { char A[6] = {'s', 't', 'd', '\0', 'i', 'o'}; int x = strlen(A); }

    0 nằm giữa chuỗi thì những ký tự sau \0 sẽ không được đếm.

Ví dụ:

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

Từ trên thấy được

void main()
{
  char A[6] = {'s', 't', 'd', '\0', 'i', 'o'};
  int x = strlen(A);
}

9 trong khi mảng có 6 ký tự.

Hàm strcpy()

strcpy (String Copy) dùng để sao chép toàn bộ ký tự của chuỗi này qua chuỗi khác.

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

LƯU Ý

Hàm strcpy chỉ sao chép dữ liệu từ mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

2 sang mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

3, nếu mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

3 có kích thước nhỏ hơn mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

2 thì sẽ xảy ra việc tràn dữ liệu của mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

3.

Hàm strcmp()

strcmp (String Compare) là hàm dùng để so sánh hai chuỗi với nhau. Hàm sẽ so sánh hai chuỗi với nhau và trả về các giá trị tương ứng.

  • Nếu

    void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[] { int n = 0; do {

    A[n] = B[n];  
    n++;  
    
    } while (B[n] != '\0'); } void main() { char A[5]; char B[5] = "STDIO"; strcpy(A, B); }

    8, kết quả trả về là 1
  • Nếu

    void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[] { int n = 0; do {

    A[n] = B[n];  
    n++;  
    
    } while (B[n] != '\0'); } void main() { char A[5]; char B[5] = "STDIO"; strcpy(A, B); }

    8, kết quả trả về là 0
  • Nếu

    void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[] { int n = 0; do {

    A[n] = B[n];  
    n++;  
    
    } while (B[n] != '\0'); } void main() { char A[5]; char B[5] = "STDIO"; strcpy(A, B); }

    8, kết quả trả về là -1

Hàm strcmp sẽ so sánh từng hai phần tử của hai chuỗi có cùng vị trí với nhau.

Cách so sánh giống với các so sánh 2 số thực. Tức là chỉ cần 1 phần tử của mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

3 lớn hơn phần tử cùng vị trí của mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

2 thì mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

3 sẽ lớn hơn mảng

void strcpy(char A[], char B[]) // copy chuoi B[] vao chuoi A[]
{
  int n = 0;
  do
  {
    A[n] = B[n];
    n++;
  }
  while (B[n] != '\0');
}
void main()
{
  char A[5];
  char B[5] = "STDIO";
  strcpy(A, B);
}

2. Ví dụ X = 3.14160 và Y = 3.14159 thì

int strcmp(char a[], char b[])
{
  int n = 0;
  do
  {
    if (a[n] > b[n])
      return 1;
    else if (a[n] < b[n])
      return -1;
    n++;
  } while (a[n] != '\0' || b[n] != '\0')
  return 0;
}
void main()
{
  char A[5] = "abcde";
  char B[5] = "abcde";
  int x;
  x = strcmp(A, B);
}

6.