SLIDE1

Showing posts with label giao trinh hoc c. Show all posts
Showing posts with label giao trinh hoc c. Show all posts

Saturday, March 28, 2015

Đọc và ghi file trong lập trình C/C++

Đọc file và ghi file trong lập trình C/++



Đọc file: Là cách thức bạn dùng ngôn ngữ lập trình duyệt và lấy được nội dung của file đó ra, còn phần còn lại xử lý nội dung đó như thế nào là tùy bạn. hi

Ghi file: Là công việc bạn ghi một nội dung nào đó lưu vào file.

Bài ví dụ cho phần này mình sẽ ghi file trước sau đó đọc file vừa ghi. Chúng ta sẽ lưu thông tin mảng một chiều vào trong file. Bạn hình dung trước khi ghi phải có nội dung nên ta nhập mảng trước.


void nhap(int a[], int n)
{
for(int i=1; i<=n; i++)
{
printf("Nhap pt a[%d]: ",i);
scanf("%d", &a[i]);
}
}

Ghi file trong C

Sau khi nhập thì mảng a[] đã có giá trị lúc này chúng ta sẻ ghi vào trong file, giả sử là file bcdonline.txt.


void ghifile(int a[],int n)
{
FILE *f;
f=fopen("bcdonline.text","wt");
fprintf(f,"%d",n);
for(int i=1;i<=n;i++)
fprintf(f,"%3d",a[i]);
fclose(f);
}



Trước tiên để làm việc với file bạn cần khai báo biến con trỏ FILE bạn nhớ là phải viết hoa hoàn toàn từ này.
Sau đó bạn mở bằng lệnh bằng fopen(), trong đó tham số “wt” cho phép bạn ghi file.
fprintf(): sẽ giúp bạn ghi vào file như bạn khai báo, bạn hình dung thay vì hiện trên màn hình bằng printf() thì ở đây ta hiện lên file bằng cách fprintf().
Đọc file trong C
Sau khi đã có file rồi thì chúng ta tiến hành đọc file lên và xử lý. Công việc bạn code như sau:

void docfile(int a[],int &n)
{
    FILE *f;
    f=fopen("bcdonline.text","rt");
    fscanf(f,"%d",&n);
    for(int i=1;i<=n;i++)
        fscanf(f,"%d",&a[i]);
    fclose(f);
}


  • Cũng như nói ở trên có các phần xử lý đặt trưng khi tương tác với FILE.
  • Tham số “rt” giúp bạn đọc dữ liệu từ file
  • Đọc file với lệnh fscanf();
  • Sau đó đóng file fclose();
Để kiểm tra bạn đã đọc được file hay chưa chúng ta tiến hành xử lý dữ liệu đã đọc được bằng cách xuất nó ra màn hình.
void xuat(int a[],int n)
{
    printf("\nKet Qua Doc File:\n\n");
    for(int i=1;i<=n;i++)
        printf("%3d",a[i]);
}

Tuesday, March 17, 2015

đồ họa trong c/c++ - graphics.h - visual studio c++

đồ họa trong c/c++ graphics.h visual studio c++
nguồn vietsource
download thư viện graphic.h

Trong bài này mình hướng dẫn cho các bạn biết một số hàm vẽ ảnh và cách tạo ảnh chuyển
động, in chữ . Tất cả các hàm dùng trong bài này đều được khai trong thư viện graphics.h
Chế độ màn hình văn bản (console) đen trắng hay có màu thông thường thì đều được biểu
diễn 25 dòng 80 cột.




Chế độ đồ hoạ màn hình được chia thành các điểm ảnh (pixel), bằng cách in từng điểm
ảnh ta có thể vẽ hình bất kỳ. Màn hình VGA thông thường ở độ phân giải cao có 480 hàng
và 640 cột điểm ảnh. Góc trên bên trái màn hình có toạ độ là (x,y)=(0,0), góc dưới
bên phải màn hình có toạ độ là (x,y)=(639,479), trục x hướng sang phải, trục y hướng
xuống dưới.

Để chạy đồ hoạ ta cần có tệp Egavga.bgi (tệp điều kiển màn hình VGA), các tệp Goth.chr,
litt.chr , sans.chr , trip.chr (chứa các font chữ).
Trong màn hình hiển đồ luôn có một con trỏ vẽ, đó là nơi điểm ảnh được in ra nếu
dùng lệnh putpixel, con trỏ vẽ không hiện lên màn hình như trong chế độ văn bản.


Thông thường chúng ta sử dụng đồ hoạ ở chế độ 16 màu :


Tuesday, March 10, 2015

một số chú ý đáng nhớ trong lâp trình c về chuỗi và file

một số chú ý đáng nhớ trong lâp trình c về chuỗi và file
  • fread(biến địa chỉ, bộ nhớ, số cấu trúc cần đọc, file); //trả về số cấu trúc  đọc được, nếu hết file có nghĩa là trả về 0.
  • fwrite(biến đại chỉ, bộ nhớ, số cấu trúc cần ghi, file);//trả về số cấu trúc ghi được, trả về 0 nếu ghi không được hay lên file thất bại.
    /* các cấu trúc có thể mảng, 1 biến bình thường hay biến dữ liệu kiểu cấu trúc, thay thế được các vòng for trong việc đọ hay ghi thông thường */
  • fscanf(file, kiểu, biến địa chỉ); //trả về giá trị EOF nếu quét đến cờ hiệu kết thúc file EOF (-1).
  • feof(file); //trả về giá trị là vị trí của con trỏ nếu con trỏ file đang đứng ở vị trí cờ hiệu kết thúc file. chưa kết thúc file thì trả về 0.
  • getc(file);//nếu quét đến cờ hiệu kết thúc file thì trả về giá trị char tương ứng là EOF hay (-1).
  • fopen("tên file/ có thể là đường dẫn file","kiểu mở"); //trả về địa chỉ FILE trên bộ nhớ nếu thành công, và trả về giá trị NULL nếu thất bại.
  • fgets(chuỗi nhận, số kí tự, file) trả vê địa chỉ của chuỗi s nếu get được thành công, trả về NULL hay 0 nếu không get được, địa chỉ của ô nhớ của chuỗi luôn là sô dương.
  • strstr(chuỗi s1, chuỗi s2);  trả về địa chỉ ô nhớ chứa chuỗi, là chuỗi con của s1 bắt đầu từ vị ví xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1, nếu không có chuỗi s2 trong s1 thì chuỗi để copy không có, trả về giá trị 0 hay NULL

Wednesday, January 21, 2015

Đối số mảng truyền cho hàm - con trỏ

xuat(int a[10]) hoàn toàn tương đương với xuat(int *a), tức đối số là biến con trỏ, do đó khi printf phải thêm dấu * để chuyển thành giá trị để in.
vì a là mảng ( là 1 chuổi ô nhó liên tiếp nhau, mặt định a là ô nhớ đầu tiên == a[0]) khi truyền mảng vào hàm thức chất là truyền địa chỉ của ô nhớ đầu tiên trong mảng, còn n là biến thông thường, xuat(int n) hoàn toàn khác với xuat(int *n).
mảng a trong main là nơi ta khai báo, mặt định trong main() lúc này là biến giá trị thông thường, nếu ta khai báo trong hàm xuat() mảng a[10] này thì trong hàm xuất nó mặt định là biến giá trị, khi printf không thêm dấu * gì hết, mà dùng a[i], chứ không được phép dùng a++

Friday, January 9, 2015

[một số chú ý] kiểu FILE trong ngôn ngữ c

kiểu file trong lập trình c


  • fread(biến địa chỉ, bộ nhớ, số cấu trúc cần đọc, file); //trả về số cấu trúc  đọc được, nếu hết file có nghĩa là trả về 0.
  • fwrite(biến đại chỉ, bộ nhớ, số cấu trúc cần ghi, file);//trả về số cấu trúc ghi được, trả về 0 nếu ghi không được hay lên file thất bại.
    /* các cấu trúc có thể mảng, 1 biến bình thường hay biến dữ liệu kiểu cấu trúc, thay thế được các vòng for trong việc đọ hay ghi thông thường */
  • fscanf(file, kiểu, biến địa chỉ); //trả về giá trị EOF nếu quét đến cờ hiệu kết thúc file EOF (-1).
  • feof(file); //trả về giá trị là vị trí của con trỏ nếu con trỏ file đang đứng ở vị trí cờ hiệu kết thúc file. chưa kết thúc file thì trả về 0.
  • getc(file);//nếu quét đến cờ hiệu kết thúc file thì trả về giá trị char tương ứng là EOF hay (-1).
  • fopen("tên file/ có thể là đường dẫn file","kiểu mở"); //trả về địa chỉ FILE trên bộ nhớ nếu thành công, và trả về giá trị NULL nếu thất bại.

Sunday, January 4, 2015

KIỂU CẤU TRÚC struct TRONG NGÔN NGỮ LẬP TRÌNH C

KIỂU CẤU TRÚC TRONG NGÔN NGỮ LẬP TRÌNH C

kiểu cấu trúc là dạng dữ liệu thường được định nghĩa để mô tả dữ liệu trong lập trình c có nhiều thành thược nhiều kiểu dữ liệu khác nhau
kiểu dữ liệu thành phần cso thể là cá kiêu dữ liệu cơ bản, thậm chí là cấu trúc, mảng,...
kiểu cấu trúc được định nghĩa thông qua từ kháo struct
cú pháp:
struct <tên cấu trúc>
{
danh sách các thành phần và kiểu dữ liệu cảu chúng
};
có thể dặt lại tên hoặc là làm cho tên ngắn gọn la dùng thêm từ khóa định nghĩa typedef
ví dụ:
typedef struct hocsinh
{
char ten[20];
int *namhoc;
} hs;
các thao tác như mảng, con trỏ,hàm trên biến cấu trúc hoàn toàn giống như biến thông thường
để truy xuất đến 1 phần tử của cấu trúc ta dùng toán tử chấm "." và dùng toán tử "->" đối với thành phần và biến con trỏ.
ví dụ:
hs ok;
ok.ten="Tran khanh toan";
ok->namhoc = 2015;
không nên dùng toán tử & đối thành phần cấu trúc
ví dụ:
struct hocvien
{
char ten[20];
int *diem;
};
hociven hv;
hocvien *hv2;
truy xuất như sau:
hv.ten="Tran Khanh Toan";
hv->diem = 8;
hv2[1].ten = "Tran Khanh Toan";
hv2[2]->diem = 9;
ví dụ minh họa:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

typedef struct tagHOCSINH
{
char sHoTen[50];
float fVan, fToan;
float fDTB;
}HOCSINH, *PTR_HOCSINH;

void NhapHS(PTR_HOCSINH phs, int stt);
void XuatHS(HOCSINH hs, int stt);
void main()
{
int i, nSoHS;
PTR_HOCSINH pDSHS;
printf("So luong hoc sinh: ");
scanf_s("%d", &nSoHS);
pDSHS = (PTR_HOCSINH)calloc(nSoHS, sizeof(HOCSINH));
if (pDSHS == NULL) return;
for (i = 0; i<nSoHS; i++)
NhapHS(&pDSHS[i], i);
for (i = 0; i<nSoHS; i++)
XuatHS(pDSHS[i], i);
if (pDSHS) free(pDSHS);
_getch();
}
void NhapHS(PTR_HOCSINH phs, int stt)
{
char hoten[50];
float van, toan;
_flushall();
printf("\nHoc sinh thu %d:", stt + 1);
printf("\nHo Ten: ");
gets_s(hoten);
printf("Diem van: ");
scanf_s("%f", &van);
printf("Diem toan: ");
scanf_s("%f", &toan);
strcpy_s(phs->sHoTen, hoten);
phs->fVan = van;
phs->fToan = toan;
phs->fDTB = (float)(van + toan) / 2;
}
void XuatHS(HOCSINH hs, int stt)
{
printf("\n\nHoc sinh thu %d: %s",
stt + 1, hs.sHoTen);
printf("\nVan %.1f, Toan %.1f. DTB %.1f",
hs.fVan, hs.fToan, hs.fDTB);
}

Wednesday, December 31, 2014

hàm malloc cập phát bộ nhớ động

hàm malloc, alloc,  realloc, free, cấp phát và giải phóng bộ nhớ động trong lập trình c

  1. biến động được tạ ra khi chạy chương trình. thông qua con trỏ bộ nhớ được cấp phát và quản lý
  2. các thao tác trên bộ nhớ và con trỏ nằm trong thư viện stdlib.halloc.h
  3. các hàm cấp phát và giai phóng bộ nhớ: maaloc, alloc, realloc, free
  4.  chứa năng của hàm malloc là cấ phát 1 vùng nhớ có kích thowcs size
    ví dụ: int *p;
    p=(int *)malloc(100);
    p=(int *)malloc(80*sizeof(int));
  5. hàm free dùng để giải phóng bộ nhớ đã cấp phát.
    free(p);
  6. ví dụ:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    void mian()
    {
    char *s;
    s=(char*)malloc(10);
    strcpy(s,"HELLO");
    puts(s);
    free(s);
    }
  7. hàm calloc cấp phát bộ nhớ nitems*size byte
    void *calloc(size_t nitems,size byte);
  8. hàm realloc điêuchỉnh lai kích thước đã cấp phát là block size byte
    void *realloc(void *block,sizebyte);
  9. khởi tạo mảng cấp phát động
    int *a=(int *)malloc(n*sizeof(int)):
    int *a=(int*)calloc(n,sizeof(int));
  10. kiểm tra cấp phát thành công
    if(a!=NULL)
    {
    //làm việc với mảng
    free(a);//giai phóng
    }
  11. cấp phât động mảng 2 chiều
    int **a=(int**)malloc(hàng*sizeof(int*));
    for(int i=0;i<n;i++)
    a[i]=(int*)malloc(cột*sizeof(int));


KIỂU FILE TRONG LẬP TRÌNH C

KIỂU FILE TRONG LẬP TRÌNH C
file là 1 tập hợp thông tin được lưu dưới 1 cái tên chung *.txt, *.exe
khai báo: file *tên biến; ở đây là biến con trỏ
file *open(char *tên file,char *kiểu mở);
kiểu mở là 1 trong các chuổi sau đây:
"rb":read only
"wb":write
"ab":thêm vào cuối file
"r+b":đọc và ghi
"w+b":tạo file mới để ghi và đọc
"a+b":mowrvaf thêm vào cuối file
ví dụ:
f=open("t1.txt","w+b");
đóng tập tin fclose(f);
fcloseall(f);
kiểm tra đọc đến cuối file chưa.
dùng hàm:
feof(f)=0 nếu chưa và  =1 nếu đã hết;
đọc ghi số nguyên lên file
putw(k,f);//ghi số nguyên k lên file file f
getw(f);trả về 1 số nguyên đọc được từ file f
đọc ghi 1 mẫu tin lên file
fread(*p,int size,int n,f);//đọc n mẫu tin có kích thước size, kết quả lưu vào biến con trỏ p
ví dụ:
int k;
fread(&k,2,1,f);
if(!feof(f)) printf("k=%d",k);
fwrite(*p,int size,n,f);//ghi n mẫu tin có kích thước size từ địa chỉ p lên file f
di chuyển con trỏ định vị nội dung file
rewind(f);//về đầu tập tin
fseek(f,k,vtri);
vtri:(nơi xuất phát) cụ thể là:
seek_set(hay 0):từ đầu file
seek_cur(hay 1):từ vị trí hiện tại
seek_end(hay 2):cuối file
ý nghĩa: 
dời con trỏ định vị nội dung đi k bytetinhs từ vtri
k>0:hướng di chuyển về cuối tập tin
k<0:hướng di chuyển về đầu tập tin
ftell(f): trả về vị số thứ tự byte nơi con trỏ đang đứng
áp dụng tính số phần tử của file
fseek(f,0,seek_end);
long n=ftell(f);

Friday, September 26, 2014

con trỏ trong lập trình C

1.toán tử lấy địa chỉ
trong lập trình c chúng ta cần xác định được con trỏ của ta đang ở đâu trong ct, với bộ nhớ của biến thì ng lập trình c không cần xác định vì trình biên dịch đã làm sẵn điều rắc rối đó cho chúng ta, chúng ta chỉ việc sử dụng toán tử lấy địa chỉ.
Vào thời điểm mà chúng ta khai báo một biến thì nó phải được lưu trữ trong một vị trí cụ thể trong bộ nhớ. Nói chung chúng ta không quyết định nơi nào biến đó được đặt - thật may mắn rằng điều đó đã được làm tự động bởi trình biên dịch và hệ điều hành, nhưng một khi hệ điều hành đã gán một địa chỉ cho biến thì chúng ta có thể muốn biết biến đó được lưu trữ ở đâu
Điều này có thể được thực hiện bằng cách đặt trước tên biến một dấu và (&), có nghĩa là "địa chỉ của". Ví dụ:
test= &tkt;
lệnh sẽ gán biến test là địa chỉ của bien tkt. vì khi ta đặt trước biến dấu & thì nó đã trở thành địa chỉ của biến trong bộ nhớ mà trình biên dich làm sẵn cho ta. gải sử biến tkt có địa chỉ là 1996 trong bộ nhớ thì biến test của chúng ta sẽ có giá trị là 1996 sau khi thưc hiện lệnh trên.
những biến mà nó lưu trữ địa chỉ của biến như biến test ở trên thì được gọi là con trỏ.tiếp theo chúng ta sẽ rõ biến kiểu này được khai báo như thế nào .
2.toán tử tham chiếu (*)
Bằng cách sử dụng con trỏ chúng ta có thể truy xuất trực tiếp đến giá trị được lưu trữ trong biến được trỏ bởi nó bằng cách đặ trước tên biến con trỏ một dấu sao (*) - ở đây có thể được dịch là "giá trị được trỏ bởi". Vì vậy, nếu chúng ta viết:
beth = *ted; 
(chúng ta có thể đọc nó là: "beth bằng giá trị được trỏ bởi ted"
Toán tử lấy địa chỉ (&) Nó được dùng như là một tiền tố của biến và có thể được dịch là "địa chỉ của", vì vậy &variable1 có thể được đọc là "địa chỉ của variable1". 
Nó chỉ ra rằng cái cần được tính toán là nội dung được trỏ bởi biểu thức được coi như là một địa chỉ. Nó có thể được dịch là "giá trị được trỏ bởi".. *mypointer được đọc là "giá trị được trỏ bởi mypointer". 
3. khai báo biến kiểu con trỏ
vì con trỏ có khả năng tham chiếu trực tiếp đến giá trị mà chúng trỏ tới nên cần thiết phải chỉ rõ kiểu dũ liẹu, nào mà một biến con trỏ trỏ tới khai báo nó. Vì vậy, khai báo của một biến con trỏ sẽ có mẫu sau:
type * pointer_name; 
trong đó type là kiểu dữ liệu được trỏ tới, không phải là kiểu của bản thân con trỏ. Ví dụ:
int * number; 
char * character; 
float * greatnumber; 
đó là ba khai báo của con trỏ. Mỗi biến đầu trỏ tới một kiểu dữ liệu khác nhau nhưng cả ba đều là con trỏ và chúng đều chiếm một lượng bộ nhớ như nhau (kích thước của một biến con trỏ tùy thuộc vào hệ điều hành). nhưng dữ liệu mà chúng trỏ tới không chiếm lượng bộ nhớ như nhau, một kiểu int, một kiểu char và cái còn lại kiểu float.
Tôi phải nhấn mạnh lại rằng dấu sao (*) mà chúng ta đặt khi khai báo một con trỏ chỉ có nghĩa rằng: đó là một con trỏ và hoàn toàn không liên quan đến toán tử tham chiếu mà chúng ta đã xem xét trước đó. Đó đơn giản chỉ là hai tác vụ khác nhau được biểu diễn bởi cùng một dấu.ví dụ chương trình cụ thể:
#include<stdio.h>
#include<conio.h>
void main()
{
int * diachi;
int i,n = 10;
diachi = &n;
i = *diachi;
printf(" dia chi:%d    i=%d", diachi,i);
_getch();
}
Để bạn có thể thấy rằng một con trỏ có thể mang một vài giá trị trong cùng một chương trình.Đây là một ví dụ phức tạp hơn một chút:
#include<stdio.h>
#include<conio.h>
void main()
{
int * diachi;
int n = 10;
diachi = &n;
*diachi = 20;
printf("ban dau n=10\n lay dia chi cua bien n roi thay doi gia tri cua dia chi bo nho do, no lam cho gia tri cua bien n thay doi theo\n n=%d", n);
_getch();
}
nói rõ hơn, dùng biến con trỏ lấy địa chỉ của biến n, khi đó ta dùng toán tử tham chiếu *diachi thò ta sẽ được giá trị tại địa chỉ bộ nhớ đó, cũng chính là giá trị của biến n, khi ta thay đỏi giá trị chứa trong *diachi thì nó cũng lam thay đổi giá trị của biến n.
4. con trỏ và mảng
Trong thực tế, tên của một mảng tương đương với địa chỉ phần tử đầu tiên của nó, giống như một con trỏ tương đương với địa chỉ của phần tử đầu tiên mà nó trỏ tới, vì vậy thực tế chúng hoàn toàn như nhau. Ví dụ, cho hai khai báo sau:
int numbers [20]; 
int * p; 
lệnh sau sẽ hợp lệ:
p = numbers; 
Ở đây p và numbers là tương đương và chúng có cũng thuộc tính, sự khác biệt duy nhất là chúng ta có thể gán một giá trị khác cho con trỏ p trong khi numbers luôn trỏ đến phần tử đầu tiên trong số 20 phần tử kiểu int mà nó được định nghĩa với. Vì vậy, không giống như p - đó là một biến con trỏ bình thường, numbers là một con trỏ hằng. Lệnh gán sau đây là không hợp lệ:
numbers = p; 
bởi vì numbers là một mảng (con trỏ hằng) và không có giá trị nào có thể được gán cho các hằng.

Vì con trỏ cũng có mọi tính chất của một biến nên tất cả các biểu thức có con trỏ trong ví dụ dưới đây là hoàn toàn hợp lệ:
#include<stdio.h>
#include<conio.h>
void main()
{
int *p;
int mang[4];
p = mang;
*p = 1;
p++;
*p = 2;
p = &mang[2];  *p = 3;
p += 1;
*p = 4;
for (int i = 0; i < 4; i++)
{
printf("%3d", mang[i]);
}
_getch();
}
5. khởi tạo con trỏ
Khi khai báo con trỏ có thể chúng ta sẽ muốn chỉ định rõ ràng chúng sẽ trỏ tới biến nào,
int number; 
int *tommy = &number; 
là tương đương với:
int number;
 int *tommy; 
tommy = &number; 
Trong một phép gán con trỏ chúng ta phải luôn luôn gán địa chỉ mà nó trỏ tới chứ không phải là giá trị mà nó trỏ tới. Bạn cần phải nhớ rằng khi khai báo một biến con trỏ, dấu sao (*) được dùng để chỉ ra nó là một con trỏ, và hoàn toàn khác với toán tử tham chiếu. Đó là hai toán tử khác nhau mặc dù chúng được viết với cùng một dấu.
char * terry = "hello"; 
trong trường hợp này một khối nhớ tĩnh được dành để chứa "hello" và một con trỏ trỏ tới kí tự đầu tiên của khối nhớ này (đó là kí tự h') được gán cho terry. Nếu "hello" được lưu tại địa chỉ 1702, lệnh khai báo trên có thể được hình dung như thế này:
H
E
L
L
O
1702
1703
1704
1705
1706
cần phải nhắc lại rằng terry mang giá trị 1702 chứ không phải là 'h' hay "hello".  
Biến con trỏ terry trỏ tới một xâu kí tự và nó có thể được sử dụng như là đối với một mảng (hãy nhớ rằng một mảng chỉ đơn thuần là một con trỏ hằng). Ví dụ, nếu chúng ta muốn thay kí tự 'o' bằng một dấu chấm than, chúng ta có thể thực hiện việc đó bằng hai cách: 
terry[4] = '!'; 
*(terry+4) = '!'; 


Tuesday, September 23, 2014

chuỗi , xâu ký tự trong c


chuỗi , xâu ký tự trong c
Trong tất cả các chương trình chúng ta đã thấy cho đến giờ, chúng ta chỉ sử dụng các biến kiểu số, chỉ dùng để biểu diễn các số. Nhưng bên cạnh các biến kiểu số còn có các xâu kí tự, chúng cho phép chúng ta biểu diễn các chuỗi kí tự như là các từ, câu, đoạn văn bản... Cho đến giờ chúng ta mới chỉ dùng chúng dưới dạng hằng chứ chứa quan tâm đến các biến có thể chứa chúng.
Trong C không có kiểu dữ liệu cơ bản để lưu các xâu kí tự. Để có thể thỏa mãn nhu cầu này, người ta sử dụng mảng có kiểu char. Hãy nhớ rằng kiểu dữ liệu này (char) chỉ có thể lưu trữ một kí tự đơn, bởi vậy nó được dùng để tạo ra xâu của các kí tự đơn.
Ví dụ, mảng sau (hay là xâu kí tự):
char ho_ten[20];
có thể lưu một xâu kí tự với độ dài cực đại là 20 kí tự. Bạn có thể tưởng tượng nó như sau:




















Kích thước cực đại này không cần phải luôn luôn dùng đến. ví dụ xâu ho_ten ở trên có thể lưu các từ như "toan" hay "tran khanh toan".. Vì các mảng kí tự có thể lưu các xâu kí tự ngắn hơn độ dài của nó.
chúng ta có thể biểu diễn nó cho dễ hiểu như sau:

T
O
A
N
















T
R
A
N

K
H
A
N
H

T
O
A
N





 1.Khởi tạo các xâu kí tự. 
Vì những xâu kí tự là những mảng bình thường nên chúng cũng như các mảng khác. Ví dụ, nếu chúng ta muốn khởi tạo một xâu kí tự với những giá trị xác định chúng ta có thể làm điều đó tương tự như với các mảng khác: 
char ho_ten[]={'t','o','a','n'};
char ho_ten[]={"toan"};
char ho_ten[]="xau ki tu";
2.các lệnh nhập xuất dữ liệu dùng riêng cho chuỗi, xâu ký tự
  • nhập ký tự vào cho mảng xâu: gets_s(biến kiểu xâu hay tên mảng xâu mà ta đã tạo);
  • xuất ký tự trong mảng xâu ra màn hình: puts(biến kiểu xâu hay tên mảng xâu mà ta đã tạo);
*chú ý: trước khi nhập dữ liệu cho mảng xâu ta nên xóa rác trong bộ nhớ đệm cho đảm bảo an toàn khi viết chương trình, cú pháp như sau: _flushall();
3.ví dụ về khởi tạo, nhập và xuất mảng kiểu xâu ký tự:
#include<stdio.h>
#include<conio.h>
void main()
{
char ho_ten[20];
printf("nhap ho va ten:\n");
_flushall();
gets_s(ho_ten);
puts(ho_ten);
_getch();
}
__________________________________________________

#include<stdio.h>
#include<conio.h>
void main()
{
char ho_ten[] = { "ho va ten" };
puts(ho_ten);
_getch();
}
4.Gán giá trị cho xâu kí tự 
Vì vế trái của một lệnh gán chỉ có thể là một phần tử của mảng chứ không thể là cả mảng, chúng ta có thể gán một xâu kí tự cho một mảng kiểu char sử dụng một phương pháp như sau: 
xau[0]="h";
xau[1]="e";
xau[2]="l";
xau[3]="l";
xau[4]="o";
Nhưng rõ ràng đây không phải là một phương pháp thực tế. Để gán giá trị cho một xâu kí tự, chúng ta có thể sử dụng loạt hàm kiểu strcpy (string copy), hàm này được định nghĩa trong string.h và có thể được gọi như sau: 
strcpy (string1, string2); 
Lệnh này copy nội dung của string2 sang string1. string2 có thể là một mảng, con trỏ hay một hằng xâu kí tự, bởi vậy lệnh sau đây là một cách đúng để gán xâu hằng "Hello" cho mystring: 
strcpy (mystring, "Hello"); 
ví dụ:
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char ho_ten[20];
strcpy_s(ho_ten, "tran minh an");
puts(ho_ten);
_getch();
}
Để ý rằng chúng ta phải include file <string.h> để có thể sử dụng hàm strcpy., trong visual 2013 thì lệnh strcpy thay thế bằng strcpy_s(...,...);
 chúng ta luôn có thể viết một hàm đơn giản như ganchuoi  để thay cho lệnh strcpy:
#include<stdio.h>
#include<conio.h>
void copy(char st1[], char st2[])
{
int n = 0;
do
{
st1[n] = st2[n];
n++;
} while (st2[n] != 0);
}
void main()
{
char ho_ten[20];
copy(ho_ten, "tran minh dang");
puts(ho_ten);
_getch();
} 
5.Các hàm để thao tác trên chuỗi 
Thư viện cstring (string.h) không chỉ có hàm strcpy mà còn có nhiều hàm khác để thao tác trên chuỗi. Dưới đây là giới thiệu lướt qua của các hàm thông dụng nhất:
char* strcat (char* dest, const char* src); 
Gắn thêm chuỗi src vào phía cuối của dest. Trả về dest. 
int strcmp (const char* string1, const char* string2); 
So sánh hai xâu string1 và string2. Trả về 0 nếu hai xâu là bằng nhau. 
char* strcpy (char* dest, const char* src);
Copy nội dung của src cho dest. Trả về dest.
 size_t strlen (const char* string); 
Trả về độ dài của string. 
Chú ý: char* hoàn toàn tương đương với char[]