So sánh chuỗi với mảng trong c

Yêu cầu bài tập C này là so sánh xem hai chuỗi có đồng nhất (giống nhau) hay không. Để giải bài tập C này bạn cần sử dụng vòng lặp để duyệt qua tất cả các ký tự của hai chuỗi và kiểm tra từng ký tự tương ứng với chỉ mục có giống nhau không.


Lời giải

Dưới đây là chương trình C để giải bài tập so sánh 2 chuỗi trong C:

include

int main() { char s1[50]; char s2[50]; int n = 0; short flag = 1;

printf("Nhap chuoi s1: ");  
gets(s1);  
printf("Nhap chuoi s2: ");  
gets(s2);  
// so sanh chuoi s1 voi s2 while (s1[n] != '\0') {
  if(s1[n] != s2[n]) {  
     flag = 0;  
     break;  
  }  
  n++;  
} if(flag == 1) {
  printf("Chuoi %s va chuoi %s la giong nhau.", s1, s2);  
}else {
  printf("Chuoi %s va chuoi %s la khac nhau.", s1, s2);  
} return 0; } Chạy chương trình C trên cho kết quả như sau:

So sánh chuỗi với mảng trong c



So sánh chuỗi với mảng trong c

Về cơ bản thì $* và $@ giống nhau khi sử dụng với biến đơn không đặt trong dấu “”. Khi đặt vào trong dấu nháy kép “” thì:

  • $*: Các tham số đưa vào sẽ được nối thành một chuỗi và được phân cách nhau bởi dấu cách.
  • $@: Các tham số đưa vào sẽ được phân biệt một cách riêng lẽ từng tham số một.

Ví dụ khác nhau giữa $* và $@:

#!/bin/bash echo -e "Using "$":" for str in "$" do echo $str done echo -e "Using "$@":" for str in "$@" do echo $str done

Kết quả khi chạy script ./test.sh my name is Dang là:

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

Các toán tử cơ bản:

  • Về cơ bản thì shell linux sử dụng các toán tử cơ bản như các ngôn ngữ lập trình khác như C/C++, Java,… Tuy nhiên với toán tử nhân khi sử dụng nên dùng \* để phân biệt với lệnh bất kỳ * của linux
  • Sử dụng cú pháp: expr op1 op2 (để trong 2 dấu “ ` ” không phải nháy đơn đây là để thực thi lệnh shell expr)

echo expr 2 + 3

sẽ hiển thị kết quả là 5

echo `expr 2 * 3’

kết quả là 2 * 3 = 6

  • Sử dụng cú pháp let “phép tính”

let “a=$a+3” let ”c=$a*$b”

Ngoài ra let có thể sử dụng các toán tử +=, -=, =+, =- khá tương tự như trong C/C++ và java

  • Sử dụng cú pháp: $((…))

Z=$(($a + $b)) Z=$(($a * $b))

Kiểm tra điều kiện (condition):

  • Có cấu trúc [ condition ]
  • Trả về giá trị có kiểu boolean (true / false)

ví dụ:

if [4 -eq 2]; then

echo True;  
else
echo False;  
fi

False

So sánh số học:

  • “-eq” => Bằng nhau (Equal)
  • “-ne” => Không bằng nhau (Not equal)
  • “-lt” => Nhỏ hơn (Less than)
  • “-gt” => Lớn hơn (Greater than)
  • “-le” => Nhỏ hơn hoặc bằng (Less or equal)
  • “-ge” => Lớn hơn hoặc bằng (Greater or equal)
  • “-o” => OR
  • “-a” => AND

Ví dụ:

var=10 [ $var -eq 0 ] => FALSE

So sánh chuỗi:

  • [[ $str1 = $str2 ]] hoặc [[ $str1 == $str2 ]]
  • [[ $str1 != $str2 ]]
  • [[ $str1 > $str2 ]]
  • [[ $str1 < $str2 ]]

str1="HELLO" str2="Hello" [[ $str1 > $str2 ]] =>TRUE``

  • [[ -z $str1 ]]: Trả về TRUE nếu $str1 là 1 chuỗi rỗng. FALSE nếu ngược lại
  • [[ -n $str1 ]]: Trả về TRUE nếu $str1 là 1 chuỗi khác rỗng. FALSE nếu ngược lại.

Kiểm tra tập tin:

  • [[ -f FILE ]] : Trả về TRUE nếu file_var là 1 tập tin.
  • [[ -x FILE ]]: Trả về TRUE nếu var là tập tin và có quyền thực thi (executable).
  • [[ -d FILE ]] : Trả về TRUE nếu var là 1 thư mục.
  • [[ -e FILE ]] : Trả về TRUE nếu var tồn tại.
  • [[ -w FILE ]] : Trả về TRUE nếu var là 1 tập tin và có quyền ghi (writable).
  • [[ -r FILE ]] : Trả về TRUE nếu var là 1 tập tin và có quyền đọc (readable).
  • [[ -h FILE ]] : Trả về TRUE nếu var là 1 liên kết mềm (symlink).
  • [[ -s FILE ]] : Trả về TRUE nếu file có dung lượng lớn hơn 0 bytes.
  • [[ FILE1 -ef FILE2 ]] : Trả về TRUE nếu cùng là 1 file.

ví dụ:

fpath="/etc/passwd" if [ -e $fpath ]; then

echo File exists;  
else
echo Does not exist;  
fi

mảng trong bash:

  • Cú pháp khai báo:

=([giatri1] [giatri2] ... [giatrin])

list=(coffee water beer)

  • Lấy số lượng phần tử của mảng:

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

0

  • Truy xuất phần tử trong mảng:

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

1

  • Tìm và thay thế phần tử trong mảng:

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

2

  • In tất cả phần tử, phân cách bởi space

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

3

  • Độ dài chuỗi của phần tử đầu tiên

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

4

  • Độ dài chuỗi của phần tử n

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

5

  • Lấy mảng con từ vị trí n với m phần tử.

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

6

  • Thêm phần tử (Push).

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

7

  • Xoá phần tử:

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

8

  • Tạo bản sao

Khi sử dụng “$*” thì các tham số được xem là một chuỗi phân biệt bởi khoảng trắng

Using "$*":

my name is Dang

Khi sử dụng “$@” thì các tham số được xem như các biến riêng lẽ được đặt trong một mảng

Using "$@":

my name is Dang

9

  • Nối mảng:

echo expr 2 + 3

sẽ hiển thị kết quả là 5

echo `expr 2 * 3’

kết quả là 2 * 3 = 6

0

  • Tạo mảng từ file

echo expr 2 + 3

sẽ hiển thị kết quả là 5

echo `expr 2 * 3’

kết quả là 2 * 3 = 6

1

Qua bài viết trên, chúng ta đã nắm được các toán tử cơ bản trong bash, cách thực hiện các phép tính toán, các phép so sánh số học và chuỗi, kiểu dữ liệu mảng (array). Sau bài viết, các bạn hãy thực hành thêm về các toán tử cơ bản trên để nắm chắc về chúng nhé vì chúng sẽ hổ trợ rất nhiều cho chúng ta trong việc học tập lập trình ngôn ngữ Bash sau này đó. Bài viết sau, mình sẽ cùng các bạn tìm hiểu về các cấu trúc điều khiển và các toán tử xử lý chuỗi trong ngôn ngữ Bash.