Tài liệu được biên soạn rất chi tiết: khai báo hàm, tham số, cách sử dụng hàm và ví dụ minh họa. Bao gồm các thư viện: , , , , , , . Tài liệu rất có ích cho các bạn mới bắt đầu học lập trình C cũng như người đã đi làm. Tài liệu được tham khảo tại diễn đàn: http:vncoding.netforumshowthread.php?p=3202post3202
Trang 1Title: Thư viện hàm ngôn ngữ lập trình C
Author: Vu Hong Viet
Date: 09/11/2014
Thư viện hàm ngôn ngữ lập trình C
<Tài liệu tham khảo từ diễn đàn: http://vncoding.net/forum/index.php)
Trang 2- Nếu biểu thức đầu vào có giá trị là true (1), hàm assert() sẽ không làm gì
(chương trình vẫn thực hiện như bình thường)
- Định dạng của thông báo lỗi phụ thuộc ứng dụng gọi hàm assert( )
Nếu là Console application thì thông báo lỗi sẽ được hiển thị lên màn hình console như khi chúng ta sử dụng lệnh printf( )
(Để xem thêm các bài tập C console application, bạn hãy truy cập link sau:
http://vncoding.net/forum/forumdisplay.php?f=20 gồm hơn 1000 bài tập lập trình C hữu ích cho bạn ôn luyện)
Nếu là ứng dụng Win32 (ứng dụng có giao diện window), thì hàm assert( ) sẽ gọi hàm MessageBox( ) hiển thị 1 cửa sổ message box với button “OK” Nếu bạn click vào button “OK”, ứng dụng Win32 của bạn sẽ kết thúc ngay lập tức (Để xem them các bài tập lập trình Win32, bạn hãy truy cập link sau:
http://vncoding.net/forum/forumdisplay.php?f=2 , hy vọng sẽ giúp ích nhiều cho các bạn)
Ví dụ: Trong đoạn code dưới đây, hàm analyze_string( ) gọi hàm assert( ) để kiểm
tra các điều kiện của string đầu vào ( con trỏ NULL, string là rỗng, chiều dài string phải lớn hơn 2) Nếu 1 trong các điều kiện này trả về false, thì message lỗi tương ứng sẽ được chỉ ra
Trang 3#include <stdio.h>
#include <conio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 );
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2 }
Kết quả:
Analyzing string 'abc'
Analyzing string '(null)'
Analyzing string ''
Trang 4Ví dụ:kiểm tra số nguyên c1 và c2 có phải là alphanumberic không?
Trang 5int isalpha(int c);
Ví dụ: kiểm tra c1 = 48 (số 0 trong bảng mã ASCII), c2 = 97 (kí tự ‘a’)
Trang 6int iscntrl(int c);
Ví dụ: kiểm tra c1 = 10 và c2 = 19 có phải là kí tự điều khiển không?
Trang 7int isdigit(int c);
Trang 8int isgraph(int c);
Ví dụ: kiểm tra c1 = 40 (kí tự @) và c2 = 7 (tiếng chuông) có phải là kí tự in được
Trang 9int islower(int c);
int c1 = 97; // character 'a'
int c2 = 65; // character 'A'
Trang 10int isupper(int c);
int c1 = 97; // character 'a'
int c2 = 65; // character 'A'
Trang 11int isprint(int c);
int c1 = 32; // character space
int c2 = 69; // character 'E'
Trang 12int ispunct(int c);
Parameter:
c : tham số đầu vào kiểu int
Remark:
Hàm ispunct( ) kiểm tra tham số c Nếu c là kí tự in được (từ 0x20 – 0x7E, ngoại trừ
kí tự space, chữ cái và chữ số), hàm sẽ trả về giá trị khác 0 Và nếu c không phải là
int c1 = 32; // character space
int c2 = 69; // character 'E'
c1 is NOT punctuation character
c2 is NOT punctuation character
Trang 13int isspace(int c);
Ví dụ: kiểm tra c1 = 32 và c2 = 9 có phải là kí tự trắng không?
int c1 = 32; // character space
int c2 = 9; // horizontal tab
Trang 14int isxdigit(int c);
Trang 15int tolower(int c);
Parameter:
c : kí tự đầu vào để convert thành kí tự in thường
Remark:
Hàm tolower ( ) kiểm tra tham số c và convert kí tự c thành kí tự in thường Nếu c là
kí tự in hoa, hàm sẽ trả về kí tự in thường Để đảm bảo hàm tolower( ) trả về kết quả mong muốn, chúng ta cần dùng hàm isupper( ) để kiểm tra kí tự cần convert là kí tự
printf("\n%c is uppercase character", c);
printf("\n%c is converted into lowercase: %c",c,
Trang 16int toupper( int c );
Parameter:
c : kí tự đầu vào để convert thành kí tự in hoa
Remark:
Hàm toupper ( ) kiểm tra tham số c và convert kí tự c thành kí tự in hoa Nếu c là kí
tự in thường, hàm sẽ trả về kí tự in hoa Để đảm bảo hàm toupper( ) trả về kết quả mong muốn, chúng ta cần dùng hàm islower( ) để kiểm tra kí tự cần convert là kí tự
printf("\n%c is lowercase character", c);
printf("\n%c is converted into uppercase: %c",c,
Trang 17Hàm exp( ) sẽ trả về giá trị e mũ x, nếu thành công
- Nếu tràn trên (overflow), hàm sẽ trả về INF
- Nếu tràn dưới (underflow), hàm sẽ trả về 0
Trang 18double log(double x);
double log10(double x);
Parameter:
x: giá trị double
Remark:
Hàm log( ) tính logarit giá trị x
- Hàm log( ) sẽ trả về giá trị logarit cơ số e (ln(x)) của x, nếu thành công
- Hàm log10( ) sẽ trả về logarit cơ số 10 của x, nếu thành công
- Hàm log( ), log10() sẽ trả về giá trị không xác định, nếu x < 0
- Hàm log( ), log10() sẽ trả về giá trị INF, nếu x = 0
Trang 19double pow(double x, double y);
Trang 21double ceil(double x);
double question = 45.35, answer;
answer = ceil( question );
printf("\nceil(%.3f) = %.2f", question, answer);
Trang 22double floor(double x);
Trang 23double fabs(double x);
Trang 24double ldexp(double x, int exp);
Trang 25double frexp(double x,int *expptr);
Parameter:
x: tham số đầu vào double
expptr: Con trỏ trỏ tới vùng nhớ lưu giá trị mũ ( exponent)
Remark:
- Hàm frexp( ) chia nhỏ số dấu phẩy động x thành mantissa (m) và exponent( n) Trong đó, giá trị tuyệt đối của m ( 0.5 <= m < 1.0) và x = m*2^n Số mũ n
exponent được lưu tại vùng nhớ được trỏ tới bởi con trỏ expptr
- Hàm frexp( ) trả về phần mantissa Nếu x = 0, mantissa và exponent đều bằng 0 Nếu expptr = NULL, thì đầu vào không hợp lệ
Trang 26double modf( double x, double *intptr);
Parameter:
x: tham số đầu vào double
intptr: con trỏ trỏ tới vùng nhớ lưu giá trị phân nguyên
x = -14.87654321; /* Divide x into its fractional */
y = modf( x, &n ); /* and integer parts */
printf( "For %f, the fraction is %f and the integer
Trang 27double fmod(double x, double y);
Parameter:
x, y: tham số đầu vào double
Remark:
- Hàm fmod( ) trả về phần dư của phép chia x/y Nếu y = 0, hàm sẽ trả về NaN
- Hàm fmod( ) tính phần dư f của phép chia x/y x = i*y + f (trong đó: i là số
Trang 28double sin( double x );
double cos( double x );
double tan( double x);
Trang 29double asin( double x );
double acos( double x );
double atan( double x );
Trang 30double atan2(double y, double x);
Trang 31double sinh(double x);
double cosh(double x);
double tanh(double x);
Trang 32- Hàm printf( ) in các kí tự và giá trị ra đầu ra chuẩn ( màn hình console)
- Hàm printf( ) trả về số lượng kí tự in ra màn hình thành công
Trang 33printf("\nMy forum is: %s", s);
printf("\nMy name's: %s I'm %d age", name, age);
My forum is: vncoding.net
My name's: VuHongViet I'm 25 age
Trang 34int putchar(int c);
Trang 35int puts(const char *str);
Trang 36- Hàm scanf( ) đọc dữ liệu từ đầu vào và lưu giá trị này vào các biến
- Hàm scanf( ) trả về số lượng trường dữ liệu được đọc vào thành công
Ví dụ: Khai báo biến nguyên n, nhập giá trị cho biến n từ bàn phím
Trang 37int sscanf(const char *buffer, const char
*format[,argument ] );
Parameter:
buffer: lưu dữ liệu đầu vào
format: string định dạng dữ liệu
argument: biến tùy chọn (giống như hàm printf( ))
Remark:
- Hàm sscanf( ) đọc đữ liệu theo định dạng từ string đầu vào và lưu vào các biến
- Hàm trả về số trường dữ liệu được đọc thành công
- Hàm trả về EOF nếu xảy ra lỗi hoặc kết thúc buffer đầu vào
- Hàm trả về -1 nếu buffer đầu vào NULL
// Input various data from tokenstring:
// max 80 character string:
sscanf( tokenstring, "%80s", s ); // C4996
sscanf( tokenstring, "%c", &c ); // C4996
sscanf( tokenstring, "%d", &i ); // C4996
sscanf( tokenstring, "%f", &fp ); // C4996
// Note: sscanf is deprecated; consider using sscanf_s instead
// Output the data read
printf( "String = %s\n", s );
printf( "Character = %c\n", c );
Trang 39int getchar();
Parameter:
void
Remark:
- Hàm getchar( ) đọc 1 kí tự đầu vào ( bàn phím)
- Hàm trả về kí tự đọc được, nếu đọc thành công
- Hàm trả về EOF nếu xảy ra lỗi
Trang 40char *gets(char *buffer);
Parameter:
buffer: con trỏ kiểu char lưu string đầu vào
Remark:
Hàm gets( ) đọc string từ đầu vào stdin (bàn phím) và lưu nó trong buffer
- Hàm gets( ) trả về con trỏ trỏ tới vùng nhớ lưu string, nếu đọc thành công
- Hàm gets() trả về NULL, nếu đọc không thành công
// Danger: No way to limit input to 20 chars
// Consider using gets_s instead
printf( "The line entered was: %s\n", line );
Trang 41int fflush( FILE *stream );
Parameter:
stream: con trỏ file
Remark:
- Hàm fflush( ) “làm sạch” stream( stdin: đầu vào, stdout: đầu vào)
- Hàm fflush( ) trả về 0, nếu stream được “làm sạch” thành công Và trả về EOF nếu lỗi xuất hiện
// Read each word as a string
printf( "Enter a sentence of four words with scanf: " ); for( integer = 0; integer < 4; integer++ )
Trang 42Enter a sentence of four words with scanf: this is a test
Trang 43Hàm thao tác file
FILE *fopen( const char *filename,const char *mode);
Parameter:
filename: tên file (bao gồm cả đường dẫn tới file)
mode: các chế độ open khác nhau
“r” : mở để đọc Nếu file không tồn tại hoặc không tìm thấy file, hàm fopen() trả về NULL
“w” : mở để ghi Nếu file đã tồn tại thì nội dung trong file sẽ bị xóa
“a” : mở để ghi tiếp vào cuối file Nếu file không tồn tại, file sẽ được tạo mới
“r+”: mở để đọc và ghi Điều kiện: file phải tồn tại
“w+” : mở file trống để đọc và ghi Nếu file đã tồn tại, nội dung sẽ bị xóa
“a+” : mở để đọc và ghi tiếp vào cuối file Sẽ tạo file mới nếu file không tồn tại
Remark:
- Hàm fopen( ) dùng để mở file để đọc/ghi/
- Hàm fopen( ) sẽ trả về con trỏ FILE nếu mở thành công, và trả về NULL nếu xảy
ra lỗi (không tìm thấy file, file không tồn tại, )
FILE *stream, *stream2;
//Open for reading
if( (stream = fopen( "vncoding.c", "r" )) == NULL )
printf( "The file 'vncoding.c' was not opened\n" ); else
printf( "The file 'vncoding.c' was opened\n" );
Trang 44// Open for write
if( (stream2 = fopen( "log.txt", "w+" )) == NULL )
printf( "The file 'log.txt' was not opened\n" );
The file 'vncoding.c' was not opened
The file 'log.txt' was opened
Trang 45int fclose(FILE *stream);
Parameter:
stream: con trỏ FILE
Remark:
- Hàm fclose( ) dùng để đóng file sau khi hoàn thành các thao tác đọc/ghi
- Hàm fclose( ) trả về 0 nếu đóng file thành công Và trả về EOF nếu đóng file xảy
ra lỗi
Trang 46int fprintf(FILE *stream, const char *format [,argument ] )
Parameter:
stream: con trỏ FILE
format: tương tự như hàm printf( )
Remark:
Hàm fprintf() dùng để ghi dữ liệu ra file (dạng text)
- Hàm fprintf() trả về số byte được ghi ra file
- Hàm trả về giá trị âm, nếu đầu ra xuất hiện lỗi
Ví dụ: Ghi ra file nội dung sau: “This is forum for all developers”
Trang 47int fscanf(FILE *stream,const char *format [, argument ] );
Paramter:
stream: con trỏ file
format: giống hàm printf( ) và scanf( )
Remark:
Hàm fscanf( ) đọc dữ liệu có định dạng từ file
- Hàm fscanf( ) trả về số lượng trường dữ liệu đọc thành công
- Hàm trả về 0 nếu đọc không thành công
- Format của hàm fscanf( ) phải giống của đầu vào hàm fprintf( )
Chú ý:
- Hàm fscanf( ) đọc dữ liệu xong, con trỏ file sẽ bị dịch chuyển đi
- Nếu hàm fprintf( ) ghi xuống file nhiều dữ liệu khác nhau (int, float, char*, ) thì định dạng ghi xuống nên phân tách giữa các dữ liệu này (có thể bằng dấu cách hoặc tab ‘\t’ hoặc dấu xuông dòng ‘\n’) , thì hàm fscanf( ) mới có thể đọc được
Ví dụ: Ghi và đọc file bằng hàm fprintf( ) và fscanf( )
if( (fp = fopen("D:\\data.bar", "w+" )) == NULL)
printf( "The file data.bar was not opened\n" );
else
Trang 48{
fprintf( fp, "%s\n%ld %f %c", "vncoding.net", 2013, 3.14159, 'x' );
// Set pointer to beginning of file:
fseek( fp, 0L, SEEK_SET );
// Read data back from file:
n_byte = fscanf(fp, "%s\n%ld %f %c", s, &l, &f, &c); // Output data read:
printf("\nn_byte = %d\n",n_byte);
Trang 49int fputc(int c, FILE *stream);
Parameter:
C: mã ASCII của kí tự muốn ghi xuống file
stream: con trỏ file
Remark:
- Hàm fputc( ) ghi 1 kí tự xuống file
- Hàm trả về mã ASCII của kí tự được ghi xuống file thành công
- Hàm trả về mã EOF nếu lỗi xảy ra
if((fp = fopen("D:\\data.txt","w+")) == NULL)
printf("\nError in opening file");
Trang 51int fgetc(FILE *stream);
Parameter:
stream: con trỏ file
Remark:
Hàm fgetc( ) đọc 1 kí tự từ file
- Hàm fgetc( ) trả về mã ASCII của kí tự đọc được
- Hàm trả về EOF nếu gặp lỗi hoặc cuối file
if((fp = fopen("D:\\data.txt","w+")) == NULL)
printf("\nError in opening file");
Trang 52*p = '\0'; // NULL at the end of string
Trang 53int fputs(const char *str, FILE *stream);
Parameter:
str: con trỏ tới string
stream: con trỏ file
Remark:
Hàm fputs( ) ghi string (kiểu char*) xuống file
- Hàm fputs( ) trả về giá trị không âm nếu ghi thành công
- Hàm trả về EOF nếu lỗi xảy ra
Ví dụ: xem ví dụ ở hàm fgets( )
Trang 54char *fgets(char *str, int n, FILE *stream);
Parameter:
str: con trỏ trỏ tới string (đã được khởi tạo hoặc cấp phát bộ nhớ để lưu string đọc từ file)
n: số lượng kí tự tối đa để đọc
stream: con trỏ file
Remark:
Hàm fgets( ) đọc string từ file
- Hàm fgets( ) trả về con trỏ tới string đọc được nếu thành công
- Hàm trả về NULL nếu xảy ra lỗi hoặc gặp cuối file
if((fp = fopen("D:\\data.txt","w+")) == NULL)
printf("\nError in opening file");
Trang 55}
Kết quả:
vncoding.ne
Trang 56size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
Parameter:
buffer: con trỏ trỏ tới data cần ghi xuống file
size: kích thước data cần ghi xuống file (tính theo byte)
count: số lượng data được ghi xuống file
Remark:
Hàm fwrite() ghi data xuống file Hàm fwrite( ) khác với hàm fprintf( ) ở chỗ: hàm fwrite( ) có thể ghi cả struct, object, xuống file theo kiểu binary Còn hàm fprintf( ) chỉ có thể ghi data có định dạng xuống file (dạng text)
- Hàm fwrite( ) trả về số lượng data được ghi xuống, nếu ghi thành công
- Nếu xảy ra lỗi, hàm sẽ trả về số nguyên nhỏ hơn số lượng data được ghi
Trang 57size_t fread( void *buffer, size_t size, size_t count, FILE
*stream);
Parameter:
buffer: con trỏ trỏ tới data cần ghi xuống file
size: kích thước data ghi xuống file (tính theo byte)
count: số lượng data được ghi xuống file
stream: con trỏ file
Ví dụ: Ghi xuống file struct dd/mm/yyyy bằng hàm fwrite( ) Sau đó dùng hàm
fread( ) để đọc dữ liệu từ file và hiển thị lên màn hình console
Trang 58//ghi struct date xuong file data.dat
if(fwrite(&m_date, sizeof(Date), 1, fp) != 1)
printf("Error in writting");
if(fread(&date, sizeof(Date), 1, fp) != 1)
printf("\nError in reading ");
Trang 59int fseek(FILE *stream, long offset, int origin);
Parameter:
stream: con trỏ file
offset: Số byte sẽ di chuyển con trỏ file từ vị trí origin
origin: vị trí ban đầu của con trỏ file Dưới đây là một số hằng số đã được định nghĩa sắn trong thư viện stdio.h
SEEK_CUR: vị trí hiện tại của con trỏ file
SEEK_END: vị trí cuối file
SEEK_SET: vị trí đầu file
Remark:
Hàm fseek( ) dịch con trỏ file tới vị trí mong muốn
- Hàm fseek( ) trả về 0 nếu dịch con trỏ file thành công
- Hàm trả về giá trị khác 0 nếu xảy ra lỗi
if((fp = fopen("D:\\data.txt","w+")) == NULL)
printf("\nError in opening file");
else
{
fputs(forum_name, fp);