Bài toán chuẩn hóa xâu ký tự là một bài toán rất cơ bản trong lập trình, khi mới bắt đầu làm quen lập trình hầu hết chúng ta cũng sẽ gặp qua bài toán này.
Chuẩn hóa xâu ký tự trong C/C++
Cụ thể chúng ta có thể phát biểu đề bài như sau:
Nhập một xâu ký tự từ bàn phím, hãy chuẩn hóa xâu ký tự theo các quy tác sau:
-Xóa bỏ kí tự trống (trắng) đầu dòng
-Xóa bỏ kí tự trống cuối dòng
-Xóa bỏ kí tự trống không hợp lệ(ký tự trống bị thừa)
-In hoa chữ cái đầu tiên
Vì đây là một bài toán làm quen lập trình, nhằm mục đích học tư duy logic trong lập trình. Thế nên đối với bài toán này chúng ta không được phép sử dụng các hàm chuẩn hóa có sẵn như hàm trim() chẳng hạn.
Để xử lý bài toán này chúng ta sẽ xử lý theo từng ý như sau:
Giả xử ở đây chúng ta có xâu a có độ dài là n.
- Kiếm tiền Accesstrade, kiếm tiền tại nhà với Accesstrade.vn – Tiếp thị liên kết
- MegaURL – Rút gọn link kiếm tiền có giá cao tại Việt Nam
- Top 4 App kiếm tiền online trên điện thoại tốt nhất 2022
- Xóa bỏ kí tự trống (trắng) đầu dòng
for(int i=0;i<n;i++){ //Duyệt các ký tự từ đầu xâu tới cuối xâu
if(a[i]==' '){//Kiểm tra xem nếu ký tự là khoảng trắng thì thực hiện khối lệnh
for(int j=i;j<n-1;j++){//Duyệt j từ vị trí thứ i
a[j] = a[j+1]; //Gắn phần tử j bằng phần tử kế tiếp nó
}
//=>Sau khi thực hiện vòng lặp j, xâu bị đẩy về phía trước 1 đơn vị và phần thứ i sẽ bị mất
a[n-1]=NULL; //gắn phần tử cuối cùng của xâu là NULL
i--; // Vì xâu đã bị đẩy lùi về phía trước, thực hiện kiểm tra lại ký tự đó
n--; //Vì đã xóa khoảng trắng xâu sẽ ngắn đi 1 ký tự
}
else break;//Nếu gặp ký tự không phải khoảng trắng thì thoát vòng lặp ngay lập tức
}
- Xóa bỏ kí tự trống cuối dòng
for(int i=n-1;i>=0;i--){//Duyệt các ký tự từ cuối xâu về đầu xâu
if(a[i]==' '){//kiểm tra ký tự thứ i có phải là khoảng trắng
a[i]=NULL; //Nếu là khoảng trắng chỉ cần gắn phần tử cuối xâu này là null
n--; //Lúc này xâu cũng sẽ bị ngắn đi 1 ký tự
}
else break;//nếu gặp ký tự không phải là khoảng trắng ngày lập tức dừng vòng lặp
}
- Xóa bỏ kí tự trống không hợp lệ
//Khối lệnh chạy tương tự như xóa khoảng trắng ở đầu xâu, tuy nhiên sẽ không có lệnh dừng vòng lặp nếu gặp ký tự khác ký tự khoảng trắng
for(int i=1;i<n-1;i++) //Vì ký tự khoảng trắng ở đầu và cuối xâu đã bị xóa nên i chỉ cần chạy từ vị trí thứ 1 tới n-2
{
if(a[i]==a[i+1]){
for(int j=i;j<n-1;j++){
a[j] = a[j+1];
}
a[n-1]=NULL;
i--;
n--;
}
}
- In hoa chữ cái đầu tiên
a[0] = toupper(a[0]); //in hoa chữ cái đầu tiên
hoặc nếu đề bài có thêm yêu cầu là in hoa các ký tự đầu tiên trong mỗi từ chúng ta sẽ thêm vào đoạn code sau:
for(int i=0;i<n-1;i++)
{
if(a[i] ==' ' && a[i+1]!=' ') a[i+1] = toupper(a[i+1]); //in hoa chữ cái đầu tiên mỗi từ
}
Trong đó hàm toupper sẽ có nội dung code như sau
char toupper(char charx){
if(charx >= 'a' && charx <='z') charx = charx-32; //Nếu ký tự là ký tự in thường, chúng ta sẽ -32 để biến đổi nó thành in hoa(trong bảng mã ASCII ký tự thường và hoa cách nhau 32 đơn vị)
return charx;
}
Chương trình minh họa hoàn chỉnh
- Khóa học lập trình C/C++ từ A-Z cho người mới – Giảm giá 40% hôm nay
- Khóa học Java cơ bản dành cho người mới bắt đầu- Giảm 40% hôm nay
- Khóa học lập trình Android từ cơ bản đến thành thạo – Giảm ngay 40%
#include <stdio.h>
#include <string.h>
//Hàm biến đổi ký tự thường thành ký tự hoa
char toupper(char charx){
if(charx >= 'a' && charx <='z') charx = charx-32;
return charx;
}
//Hàm chuẩn hóa xâu
void chuanHoa(char a[])
{
int n = strlen(a); //Lấy độ dài xâu
//Xóa khoảng trắng đầu xâu
for(int i=0;i<n;i++){
if(a[i]==' '){
for(int j=i;j<n-1;j++){
a[j] = a[j+1];
}
a[n-1]=NULL;
i--;
n--;
}
else break;
}
//Xóa khoảng trắng cuối xâu
for(int i=n-1;i>=0;i--){
if(a[i]==' '){
a[i]=NULL;
n--;
}
else break;
}
//Xóa khoảng trắng không hợp lệ(khoảng trắng bị thừa)
for(int i=1;i<n-1;i++)
{
if(a[i]==a[i+1] && a[i]==' '){
for(int j=i;j<n-1;j++){
a[j] = a[j+1];
}
a[n-1]=NULL;
i--;
n--;
}
}
//In hoa ký tự đầu tiên
a[0] = toupper(a[0]);
}
int main()
{
char a[100];
printf("Moi ban nhap chuoi:"); gets(a);
chuanHoa(a);
printf("Chuoi duoc chuan hoa:");
puts(a);
}
Kết quả chạy chương trình
Cảm ơn bạn đã theo dõi bài viết! Chúc bạn học tốt!
XEM THÊM Cách tìm UCLN và BCNN trong lập trình C/C++ Tìm hiểu về Hàm đệ quy trong lập trình Thuật toán tìm kiếm nhị phân trong C/C++ Thuật toán đếm số lượng chữ số của số nguyên dương n bằng C / C++ Thuật toán tính dãy số Fibonacci bằng 3 cách trong C/C++
cai nay xoa ca ki tu giong nhau VD h ell o => H el o
cảm ơn bạn đã phản hồi lại nha, do mình thiếu đk nên ký tự lặp bị xoá nhầm…..