đôi chút về con trỏ, const và chuỗi kí tự
-hồi trước mình học lập trình rất nhiều nhưng cũng chả biết nó dùng để làm gì ngoài quản lý bộ nhớ thì hôm nay mình xin chia sẽ 1 chút...
-hồi trước mình học lập trình rất nhiều nhưng cũng chả biết nó dùng để làm gì ngoài quản lý bộ nhớ thì hôm nay mình xin chia sẽ 1 chút nhá
- quay lại lich sử ra đời của con trỏ thì con trỏ được tạo ra cho ngôn ngữ c nó ra đời khi khả năng tính toán lưu trữ của máy tính kém hơn hiện nay rất nhiều và tốc độ khi sử dụng vùng nhớ gần như là điều bắt buộc, khả năng làm việc với vùng nhớ luôn là lựa chọn hàng đầu
- con trỏ được bỏ vào c vì 1 số tính năng quan trọng bị thiếu trong ngôn ngữ gốc: mảng, chuỗi và tham chiếu trong hàm(&), chúng cũng có thể dùng để tối ưu cho chương trình chạy nhanh hơn và ít sử dụng bộ nhớ hơn
-[] mảng trong c thực ra là 1 biến con trỏ được trỏ tới bộ nhớ trong đó các phần tử được lưu trữ theo thứ tự
- con trỏ dùng làm chuỗi kí tự giống như mảng nó thực chất là 1 con trỏ thậm chí không được ẩn dưới cú pháp của câu lệnh mà nó trực tiếp được tạo ra để trỏ tới vùng nhớ có kiểu char
-sử dụng con trỏ có thể tối ưu hóa vì nó không phải sao chép dữ liệu
nó có thể thay thế trong biến cấu trúc nó được phổ biến đến nỗi người ta đặt toán tử -> để thay cho (*pointer).trường
-tóm lại con trỏ trông rất phức tạp vì nó không cho biết mục đích rõ ràng của nó khi sử dụng nó có thể kết hợp sâu nhiều cấp độ nhưng phần lớn bổ sung nhiều tính năng còn thiếu trong c
-hệ thống const là 1 trong những tính năng khá lộn xộn của c++, khái niệm này rất đơn giản khi được khai báo với biến const thì nó là 1 hằng số và không thể bị thay đổi tuy nhiên nó cũng được để bổ sung 1 số tính năng còn thiếu trong c++ và nó trở nên phức tạp còn hơn con trỏ của c nữa đôi khi là bị hạn chế rất khó chịu
- việc sử dụng đơn giản nhất là 1 hằng số được đặt tên nó có thể mạnh hơn tiền xử lý của c ở chỗ #define nó được trình biên dịch hiểu và sử dụng vì thế các thông báo lỗi sẽ rất hữu ích.
-const cũng có thể sử dụng với các con trỏ nhưng phải xác định xem là con trỏ không đổi hay là những gì nó trỏ đến không đổi thôi nó rất phức tạp mình sẽ nói ở bài sau
*chuỗi kí tự là 1 trong những kiểu dữ liệu được sử dụng hết sức phổ biến, trong hầu hết các ứng dụng đều có nhiều thông tin được biểu diễn dưới dạng văn bản tức là chuỗi kí tự
-các thao tác cơ bản trong xử lý chuỗi, xác định độ dài chuỗi, so sánh chuỗi, sao chép chuỗi chèn xóa chuỗi con
- xử lý token: đếm số từ, tách chuỗi thành token, ghép chuỗi thành token
-tìm kiếm trên chuỗi: so khớp chuỗi con, tìm chuỗi con, kiểm tra chuỗi con, đếm số lần xuất hiện chuỗi con, thay thế chuỗi con
- biến đổi chuỗi: chuẩn hóa chuỗi, đảo chuỗi, mã hóa chuỗi
-các dạng ký tự và chuỗi mở rộng: ký tự nhiều byte, kí tự rộng các vấn đề về unicode, các hàm và kiểu xử lý kiểu kí tự nhiều byte, chuỗi kí tự rộng
* ngôn ngữ c và c++ không xây dựng nhiều kiểu cơ sở dữ liệu dạng chuỗi
để lập trình với chuỗi kí tự có thể dùng 2 giải pháp sau đây
- sử dụng mảng kí tự theo quy ước chuỗi kí tự
- sử dụng lớp string của thư viện chuẩn (c++stl)
* 1 số lưu ý khi làm việc với mảng ký tự theo quy ước chuỗi
- giải pháp này thường được dùng chủ yếu trong ngôn ngữ C nhưng vẫn có thể áp dụng cho ngôn ngữ c++
-các hàm xử lý chuỗi trong c được khai báo trong string.h
- người lập trình phải cấp phát đủ vùng nhớ cho các mảng kí tự dùng để lưu chuỗi. ngoài vùng nhớ để lưu nội dung của chuỗi, mảng ký tự lưu thêm kí tự null('\0') để đánh dấu kết thúc chuỗi
-không sử dụng phép toán=(gán giá trị)+(ghép chuỗi)==...mà phải dụng các hàm có công dụng tương ứng trong string.h
* 1 số lưu ý khi sử dụng kiểu dữ liệu string trong thư viện stl của c++
- giải pháp này chỉ được sử dụng cho c++
- phải sử dụng đồng thời namespace std và thư viện string
1) 1 số thao tác cơ bản khi xử lý chuỗi
- xác định độ dài chuỗi
+ khi sử dụng ngôn ngữ c cấp phát cho chuỗi n kí tự thì chúng ta phải cấp phát n+1 kí tự vì ở cuối chuỗi có kí tự NULL 1 điều bắt buộc
đối với hàm xác định độ dài chuỗi trong c chúng ta có hàm strlen(char*s)
còn trong c++ có s.length(), s.size() tùy các bạn sử dụng
- so sánh chuỗi
sếp xếp chuỗi theo thứ tự từ điển là 1 bài toán thực tế các bạn gặp rất nhiều
- tiếp theo mình chỉ các bạn 1 cái điều kiện
n = (n0 < n1) ? n0 : n1;// nếu n0
cái hàm kiểm tra theo thứ tự từ điển mình cài đặt ở bên dưới nhá
{
int n0 = strlen(a);
int n1 = strlen(b);
int i, n = (n0 < n1) ? n0 : n1;
for (int i = 0; i < n; i++)
{
if (a[i] > b[i])
{
return false;
}
if (a[i] < b[i])
{
return true;
}
}
if (n0 > n)
return false;
if (n1 > n)
return true;}
int n1 = strlen(b);
int i, n = (n0 < n1) ? n0 : n1;
for (int i = 0; i < n; i++)
{
if (a[i] > b[i])
{
return false;
}
if (a[i] < b[i])
{
return true;
}
}
if (n0 > n)
return false;
if (n1 > n)
return true;}
nếu bạn nào muốn dùng thư viện thì có hàm strcmp(const char*s1,const char * s2) nó trả về giá trị âm nếu chuỗi thứ nhất nhỏ hơn chuỗi thứ 2, trả về giá trị dương nếu chuỗi thứ nhất lớn hơn chuỗi thứ 2 trả về 0 nếu 2 kí tự bằng nhau
bây giờ nếu các bạn muốn sắp xếp chuỗi theo thứ tự tăng dần thì đối với mảng
void input(char*s[])
{
char temp[1000];
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
if (strcmp(s[i], s[j]) > 0)
{
strcpy(temp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], temp);
}
}
}
}
void main()
{
char* s[10];// 10 con tro chua duoc cap phat cho tung con ma sao minh biet no se ton bao nhieu vung nho day
char b[100];
int n;
for (int i = 0; i < 10; i++)
{
cout << "nhap mang thu" << i << endl;
cout << "mang nay co bao nhieu phan tu ki tu" << endl;
cin >> n;
s[i] = (char*)malloc(n * sizeof(char));
cin>>s[i];
}
for (int i = 0; i < 10; i++)
{
cout << s[i]<}
input(s);
for (int i = 0; i < 10; i++)
{
cout << s[i] << endl;
}
}
{
char temp[1000];
for (int i = 0; i < 9; i++)
{
for (int j = i + 1; j < 10; j++)
{
if (strcmp(s[i], s[j]) > 0)
{
strcpy(temp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], temp);
}
}
}
}
void main()
{
char* s[10];// 10 con tro chua duoc cap phat cho tung con ma sao minh biet no se ton bao nhieu vung nho day
char b[100];
int n;
for (int i = 0; i < 10; i++)
{
cout << "nhap mang thu" << i << endl;
cout << "mang nay co bao nhieu phan tu ki tu" << endl;
cin >> n;
s[i] = (char*)malloc(n * sizeof(char));
cin>>s[i];
}
for (int i = 0; i < 10; i++)
{
cout << s[i]<}
input(s);
for (int i = 0; i < 10; i++)
{
cout << s[i] << endl;
}
}
các bạn sử dụng con trỏ hơi bất tiện ở chỗ mỗi lần dùng nó các bạn đều phải cấp phát cho nó nếu cấp phát trước sẽ dẫn đến lãng phí bộ nhớ, với hàm strcpy(char*s1,char*s2) dùng để copy cái s2 vào cái s1 giống như dấu bằng ấy nhưng đây là copy giá trị con trỏ quản lý địa chỉ đó, nếu bạn viết 1 hàm cũng được dễ mà
nếu các bạn muốn sắp xếp các chuỗi không phân biệt chữ hoa và chữ thường thì có hàm stricmp() còn c++ thì không hỗ trợ sử dụng hàm để phân biệt hoa thường các bạn có thể chuyển kiểu string về kiểu mảng kí tự thông thường trong c bằng hàm s.c_str() hoặc chuyển về chữ thường hoặc chữ hoa luôn
-chúng ta đến với phần sao chép chuỗi
chúng ta sao chép chuỗi con của chuỗi đối với chúng ta có hàm
strncpy(dest,source+startPos,numChars);
rồi cho dest[numchars]='\0';// vậy là chúng ta có thể lấy được chuỗi con rồi phải không các bạn
tương tự đối c++ vì nó là hướng đối tượng nên
dest=source.substr(startpos,numChars);
Khoa học - Công nghệ
/khoa-hoc-cong-nghe
Bài viết nổi bật khác
- Hot nhất
- Mới nhất