QuânSysAd's Blog: c
Hiển thị các bài đăng có nhãn c. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn c. Hiển thị tất cả bài đăng

04 tháng 3 2021

C: parser string hiệu năng cao

Không nên sử dụng sscanf mà hãy sử dụng strtof


11 tháng 7 2018

Sử dụng boolean trong macro trong ngôn ngữ C

Nguyên bản trong C không đi kèm kiểu dữ liệu C, vì thế ta phải tự định nghĩa nó. Nhiều khi bạn gặp lỗi của macro khi muốn trả lại kiểu dữ liệu này trong trường hợp sử dụng macro trả lại true và false để biểu thị boolean. Nhưng true và false nhiều khi biên dịch lỗi với GCC. Cách sử dụng boolean trong C phụ thuộc nhiều tiêu chuẩn nếu sử dụng các thư viện chuẩn hoặc là tự định nghĩa nếu không dùng thư viện và phụ thuộc nhiều trình biên dịch có hỗ trợ tiêu chuẩn hay không. Tiêu chuẩn mới nhất hiện nay là C11 ngoài ra còn có tiêu chuẩn C99. GCC thì sử dụng GNU89. Muốn sử dụng C11 thì phải dùng GCC 4.7 và dùng với tuỳ chọn -std=c11.
Có nhiều cách sử dụng.
Option 1
typedef int bool;
#define true 1
#define false 0
Option 2
typedef int bool;
enum { false, true };
Option 3
typedef enum { false, true } bool;
Dùng tiêu chuẩn C99 thì có vẻ nhanh gọn nhất.
Option 4 (C99)
#include 


 Để in ra giá trị biến bool bằng printf :

 bool x = true;
 printf("%d\n", x); // prints 1

 Hoặc in ra kết quả bằng tenary operator.
 printf(x ? "true" : "false");

 Hoặc đẹp hơn.

 printf("%s", x ? "true" : "false");

 Hoặc đẹp hơn nữa.

 fputs(x ? "true" : "false", stdout);

10 tháng 7 2018

C89: Không thể tạo array có kích cỡ lấy giá trị từ biến trong C

Đối với các tiêu chuẩn cũ thì thư viện chuẩn không hỗ trợ cái này.
Tuy nhiên đối với các phiên bản C11 hay C99 đã bắt đầu hỗ trợ.
Thay vào đó hãy dùng symbolic constant để chỉ rõ kích cỡ mảng.
#define SIZE 10
Không dùng được cách sau:
int size;
int array[size];

28 tháng 6 2018

Tác dụng của con trỏ hàm

Con trỏ hàm công dụng có 2 cái chính:
Định danh tham chiếu, hay gọi là Interface kiểu hàm. Các ngôn ngữ bậc cao thì có khái niệm Interface; nhưng trong C/C++ không có? Trong C sẽ sử dụng qua con trỏ hàm, C++ có thể sử dụng qua virtual class (abstract)
Callback. Trong Java hay gọi là Listener, C# tương đương là delegate, trong các ngôn ngữ khác gọi là closure. Con trỏ hàm trong C/C++ sử dụng làm callback khá nhiều.
Áp dụng trong lập trình Windows API, MFC hay lập trình Linux.
Ta xem xét ví dụ sau:

#include 
 // A normal function with an int parameter
 // and void return type
 void fun(int a)
 {
     printf("Value of a is %d\n", a);
 }

 int main()
 {
     // fun_ptr is a pointer to function fun() 
     void (*fun_ptr)(int) = &fun;

     /* The above line is equivalent of following two
        void (*fun_ptr)(int);
        fun_ptr = &fun; 
     */

     // Invoking fun() using fun_ptr
     (*fun_ptr)(10);

     return 0;
 }
Kết quả ta có : Value of a is 10
Ở đây ta đã khai báo và định nghĩa một hàm fun. Sau đó ta tạo một con trỏ, trỏ tới hàm fun bằng:
void (*fun_ptr)(int) = &fun;
Có thể viết lại dòng trên bằng 2 dòng tương đương sau đây:
void (*fun_ptr)(int);
fun_ptr = &fun;
Lúc này ta gọi hàm fun() bằng cách sử dụng fun_ptr như sau:
(*fun_ptr)(10); Lưu ý ở đây ta đã khai báo kiểu của tham số là int nên không cần phải typecast về int trước.

26 tháng 6 2018

Access mảng 2 chiều bằng con trỏ.

Nhiều khi các bạn mới học C hay gặp trường hợp sau:
int array[5][10];
int el;

el = array[2][3];
el = *(array + 2)[3];
el = *(*(array + 2) + 3);
Bản chất 3 dòng cuối là tương đương nhau. Nhưng có khi bạn đọc vào dòng cuối cùng có khi không hiểu, thật ức chế. Hãy cùng tôi thông não hơn. Dưới đây là cách tôi giải thích. Cái này phải hiểu bản chất của mảng và con trỏ.
Khi ta khai báo mảng thì mảng xuất hiện trên một vùng nhớ, lúc này tên mảng tham chiếu tới giá trị đầu tiên của mảng array[0], phần tử mảng này là kiểu int, vì vậy nó có độ rộng 4kb (cái này tuỳ hệ điều hành), vì thế array[2] sẽ cách array[0] 2 block 4kb trên bộ nhớ. Vì thế để access array[2] bằng cấu trúc con trỏ ta có thể sử dụng *(array+2)
Tuy nhiên đối với mảng 2 chiều thì từng phần tử mảng lại là một mảng vì thế lúc này *(array+2) lại tham chiếu tới địa chỉ đầu tiên của mảng khác. Lúc này để access phần tử thứ 3 của mảng *(array+2) thì ta phải dùng *(*(array+2)+3)
Khi ta khai báo mảng 2 chiều lúc này từng phần tử của mảng 1 chiều lại chứa 1 mảng khác.

02 tháng 8 2017

C Programming: Int argc, char *argv[]: có nghĩa là gì?

Đôi khi mới bắt đầu code C, nhiều bạn hỏi trong hàm main thì khai báo int argc, char *argv[] có nghĩa là gì.
Thì đây người ta gọi là đối số dòng lệnh
argc: argument count (số lượng)
argv: argument vector (danh sách)
Người ta sẽ cần sử dụng các đối số này khi chạy chương trình với giao diện dòng lệnh
Ví dụ ta có chương trình sau biên dịch là hello.exe
Sau đó ta chạy chương trình và cho nó các tham số như sau:
# hello.exe a b c d
Thì lúc đó argc=5,
argv={"hello.exe","a","b","c", "d"} đây là các tham số ta nhập vào
Như vậy: argc là số lượng chuỗi trong argv, đầu tiên là file thực thi và tiếp theo là các tham số ta nhập vào