Exercise 10: Arrays Of Strings, Looping

Hello! Quay trở lại với loạt bài học lập trình C – Learn C The Hard Way. Hôm nay chúng ta sẽ được học một bài ngắn thôi, nhưng có lẽ nó đã khó hơn một chút rồi đấy. Ở những bài trước, chúng ta đã học các khai báo một chuỗi (hay còn gọi là mãng các kí tự). Bài hôm nay chúng ta sẽ được học mảng của chuỗi (array of strings) và học về vòng lặp for, đã quá quen thuộc. Các bạn hãy hình dung mảng của các chuỗi là như thế nào trước khi bắt tay vào viết code nhé! Mình giải thích sơ thế này, mảng là bao gồm nhiều phần tử đúng không? những bài trước thì mỗi phần tử trong mảng là số hoặc là kí tự, còn bây giờ, mỗi phần tử trong mảng là một chuỗi. Hiểu rồi chứ!

Hãy tạo một file ex10.c với nội dung sau:

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i = 0;

    //go through each string in argv
    // why am I skipping argv[0]?
    for(i = 1; i < argc; i++)
    {
        printf("arg %d: %s\n", i, argv[i]);
    }

    // let's make our own array of strings
    char* states[] = {"California", "Oregon", "Wassington", "Texas"};
    int num_states = 4;

    for(i = 0; i < num_states; i++)
    {
        printf("state %d: %s\n", i, states[i]);
    }
    return 0;
}
Bây giờ các bạn hãy đọc lại đoan code cho hiểu và sau đó là biên dịch và chạy chương trình đi nào, nhớ sử dụng Makefile và Valgrind nhé!

Chú thích: dòng 15 là cách khai báo mảng của các chuỗi, hay là dòng 3 (trong hàm main).

Và bây giờ, các bạn chạy lại chương trình với cú pháp như sau và xem điều gì xảy ra:

./ex10 i am a bunch of arguments

Chạy các bạn phải được như vậy nhé:

$ make ex10
cc -Wall -g ex10.c -o ex10
$ ./ex10 i am a bunch of arguments
arg 1: i
arg 2: am
arg 3: a
arg 4: bunch
arg 5: of
arg 6: arguments
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
$
$ ./ex10
state 0: California
state 1: Oregon
state 2: Washington
state 3: Texas
$
Đến phần giải thích code:
1. Cấu trúc vòng lặp for như sau:

for(INITIALIZER; TEST; INCREMENTER)
{
     CODE;
}
2. Tại sao mình kêu bạn chạy chương trình với dòng “i am a bunch of arguments”. C cho phép các bạn làm như vậy và lưu số phần tử trong mảng vào biến argc. Ở đây chúng ta có 6 phần tử, bao gồm phần tử đầu là tên của chương trình “./ex10” (cho nên vì sao chúng ta bỏ qua phần tử argv[0]). Và 5 phần tử còn lại của mảng argv chính là 5 chuỗi mà chúng ta đã nhập. Các bạn hãy thử nhập những chuỗi khác xem!
3. Các bạn cứ nghiền ngẫm lại mảng các chuỗi là như thế nào nhé!

Reseach

1. Hãy tìm hiểu thêm về vòng lặp for, mình gọi trong phòng lặp for có 3 khối: INITIALIZER; TEST; INCREMENTER. Vậy trong mỗi khối các bạn bỏ nhiều câu lệnh vào đó được không? Hoặc khối đó không có câu lệnh nào được không? Dùng dấu phẩy, dấy chấm phẩy như thế nào.

2. Hãy thử gán một hoặc một vài phần tử từ 2 mảng argv và states cho nhau, và thử xem chương trình chạy như thế nào.
3. Hãy thử đặt một phần tử NULL vào trong một phần tử trong mảng states và xem nó in ra như thế nào.
4. Phần tử thứ 0 của mảng states là “California”. Vậy bạn hãy thử in ra chữ “C” trong này thôi. Bạn có làm được? Gợi ý: mảng 2 chiều, chúng ta học sau (hay còn gọi là con trỏ trỏ tới con trỏ, khá là khó).
Sau khi viết ra những thứ này, thì mình thực hành ngay lập tức.

End

Advertisements