So sánh sự giống nhau của hai chuỗi trong c năm 2024

Cảm quan thì ‘có vẻ’ đúng lắm nhưng tiếc là không đúng với ý tưởng người tạo ra ngôn ngữ. Nguyên nhân sâu xa thì mình không biết nhưng mà chỉ nhớ phải theo các quy tắc của người ta. Với C/C++:

if [ strcmp[string1, string2] == 0 ] {
  // làm gì đó
}

Ở đây

if [ string1.equals[string2] ] {
  // làm gì đó
}

5 là viết tắt của

if [ string1.equals[string2] ] {
  // làm gì đó
}

6, thuộc

if [ string1.equals[string2] ] {
  // làm gì đó
}

7, có chức năng so sánh hai chuỗi theo thứ tự chữ cái trong từ điển. Giá trị trả về

if [ string1.equals[string2] ] {
  // làm gì đó
}

8 cho biết 2 chuỗi bằng nhau, giá trị trả về

if [ string1.equals[string2] ] {
  // làm gì đó
}

9 thì


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

0 ở trước


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

1, giá trị trả về


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

2 thì


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

0 ở sau


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

1.

Còn với Java:

if [ string1.equals[string2] ] {
  // làm gì đó
}

Với Java thì nó đơn giản dễ hiểu hơn nhiều, còn với C thì ta cần quay lại một chút. Xem ví dụ bên dưới:


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

Kết quả là:

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

Rõ rồi nhưng mà cái


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

5 là cái gì mà mỗi lần so sánh nó lại ra một số khác nhau thế? Để kiểm tra lại nó cụ thể là cái gì thì có thể sửa lại trong hàm


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

6:

// ...

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d ---> '%c' \n", gia_tri, abs[gia_tri]];
    //...
}
//...

Kết quả là:

gia_tri = -33 ---> '!'
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0 ---> ''
'Xin chao' BANG 'Xin chao'

gia_tri = -32 ---> ' '
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21 ---> ''
'Xin chao' LON HON 'Chao'

Rõ rồi nhé, giá trị chính là số thứ tự chênh lệch của kí tự khác nhau đầu tiên trong bảng ASCII. 33 là kí tự chấm than trừ null, còn 32 là kí tự trắng trừ null. Còn dấu thì chỉ để xem cái nào nhỏ hơn hay lớn hơn mà thôi. Còn số 21 là kí tự ‘X’ - ‘C’, không in ra được nên sẽ có


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

7.

Chú ý hàm strcmp[] so sánh kiểu thứ tự từ điển, bảng alphabet của tiếng anh sẽ có khác một số ngôn ngữ khác, khi đó giải pháp thay thế là strcoll[], mình sẽ không giải thích ở đây.

2. So sánh hai số thực

Đa số các ngôn ngữ lập trình đều có 2 kiểu số thực là


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

8 và


# include 

# include 
void so_sanh[const char* chuoi_1, const char* chuoi_2] {
    int gia_tri = strcmp[chuoi_1, chuoi_2];
    printf["gia_tri = %d \n", gia_tri];
    if [gia_tri == 0] {
      printf["'%s' BANG '%s' \n", chuoi_1, chuoi_2];
    } else if [gia_tri < 0] {
      printf["'%s' NHO HON '%s' \n", chuoi_1, chuoi_2];  
    } else if[gia_tri > 0] {
      printf["'%s' LON HON '%s' \n", chuoi_1, chuoi_2];
    }
    printf["-------------\n\n"];
}
int main[] {
    const char* chuoi = "Xin chao";
    so_sanh[chuoi, "Xin chao!"]; // co them dau '!'
    so_sanh[chuoi, "Xin chao"];
    so_sanh[chuoi, "Xin chao ban"];
    so_sanh[chuoi, "Chao"];
}

9. Nhiều khi bất cẩn ta có thể sẽ có những phép so sánh như sau:

float a = 0.123;
double b = 0.123;
printf["A = %f \nB = %f\n", a, b];
if [a == b] {
  printf["BANG NHAU \n"];
} else {
  printf["KHAC NHAU \n"];
}

Thực tiễn hai số đó bằng nhau nhưng vào máy thì 🤣

A = 0.123000
B = 0.123000
KHAC NHAU

Code chạy ngon lành nhưng đôi khi không biết lỗi ở đâu ra, cái này thực sự rất nguy hiểm.

3. Thực hiện phép tính trong mệnh đề điều kiện

Cái này một số bạn vẫn sẽ mắc bẫy vì đôi khi muốn rút gọn phép tính vào ngay trong lúc so sánh. Ví dụ bài toán kiểm tra số nguyên

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

0 có gấp ba số

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

1 hay không?

int a = 30, b = 10;
if [a / 3 == b] {
  printf["A gap ba B"];
} else {
  printf["A khong gap ba B"];
}

Kết quả:

if [ strcmp[string1, string2] == 0 ] {
  // làm gì đó
}

0

Cũng đoạn trên thay thành

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

2, ta có kết quả mới:

if [ strcmp[string1, string2] == 0 ] {
  // làm gì đó
}

0

Vi diệu chưa? Sai tè le luôn. Bởi vì kết quả phép chia 2 số nguyên sẽ luôn là một số nguyên. Việc tính toán ở đây phải cẩn thận vì bên cạnh trường hợp làm tròn số thì còn lỗi tràn nữa:

if [ strcmp[string1, string2] == 0 ] {
  // làm gì đó
}

2

Kết quả:

if [ strcmp[string1, string2] == 0 ] {
  // làm gì đó
}

3

Vâng,

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

3 chỉ vì nó tràn kiểu dữ liệu

gia_tri = -33
'Xin chao' NHO HON 'Xin chao!'

gia_tri = 0
'Xin chao' BANG 'Xin chao'

gia_tri = -32
'Xin chao' NHO HON 'Xin chao ban'

gia_tri = 21
'Xin chao' LON HON 'Chao'

4 [tối đa 255 nên 2 * 200 = -112, và máy nó hiểu -112

Chủ Đề