[C++]Chuẩn hóa xâu ký tự – Xoá khoảng trắng thừa

Chuẩn hóa xâu c++ là một quy trình quan trọng trong xử lý ngôn ngữ tự nhiên, giúp loại bỏ các khoảng trắng thừa trong chuỗi và chỉ giữ lại một ký tự trắng duy nhất giữa các từ. Kỹ thuật này giúp cải thiện tính đồng nhất và đọc hiểu của văn bản, tạo ra các chuỗi ký tự rõ ràng và dễ tiếp cận hơn.

Xem thêm: [C++] Nhập bài thơ gồm N câu đặt trong các khổ thơ

1. Bài toán chuẩn hoá xâu c++

Bài 28 (TH-CSLT-07): Nhập vào từ bàn phím một chuỗi ký tự và thực hiện các yêu cầu sau:
a. Chuẩn hóa chuỗi ký tự (xóa các khoảng trắng thừa có trong chuỗi, giữa các từ chỉ giữ lại một ký tự trắng)
b. Cho biết từ có độ dài lớn nhất có trong chuỗi và vị trí xuất hiện của chuỗi đó.
c. Nhập vào từ bàn phím từ cần thay thế x và từ mới sẽ thay thế y. Thay thế tất cả các từ gốc x đang có trong chuỗi bằng từ mới y.
d. Đảo ngược thứ tự các từ có trong chuỗi và in ra màn hình chuỗi sau khi đảo ngược.

2. Thuật toán chuẩn hoá xâu ký tự

2.1 Xóa các khoảng trắng thừa có trong chuỗi

– Các bước để chuẩn hoá chuỗi ký tự:

  • Xoá khoảng trắng ở đầu chuỗi
  • Xoá khoảng trắng ở cuối chuỗi
  • Xoá khoảng trắng thừa giữa các từ

Xoá khoảng trắng đầu chuỗi

– Vòng lặp kiểm tra điều kiện s[0]==' ': Nếu ký tự đầu tiên của chuỗi s là một ký tự trắng  thì vòng lặp sẽ tiếp tục thực hiện các câu lệnh bên trong. Nếu không, vòng lặp sẽ dừng lại và không thực hiện bất kỳ câu lệnh nào bên trong nữa.

– Vòng lặp for để thực hiện đi dời chuỗi ký tự sang trái một vị trí để loại bỏ khoảng trắng.

– Quá trình sẽ được thực hiện cho đến khi không còn ký tự trắng nào ở đầu chuỗi

Xoá khoảng trắng ở cuối chuỗi

  • Ký tự '\0' hiểu một cách đơn giản là ký tự null làm kết thúc chuỗi.
  • s[--length] ='\0': Câu lệnh này sẽ gán ký tự null vào vị trí cuối cùng của chuỗi. Quá trình này giúp loại bỏ ký tự trắng cuối chuỗi.
  • Lưu ý là toán tử giảm -- được đặt trước biến length (--length) để giảm giá trị của length trước khi sử dụng giá trị mới của nó để gán vào vị trí cuối cùng của mảng. Điều này đảm bảo rằng mảng s được cắt bỏ đi ký tự trắng cuối chuỗi sau mỗi lần lặp.

Xoá khoảng trắng thừa giữa các từ

  1. Duyệt vòng lặp for cho đến khi gặp ký tự null (\0) kết thúc chuỗi (s[i] != '\0') thì dừng.
  2. Câu lệnh s[i] == ' ' && s[i + 1] == ' ' kiểm tra xem có hai ký tự trắng liên tiếp nào trong chuỗi hay không.
  3. Thực hiện di chuyển các ký tự phía sau j sang trái, ghi đè lên ký tự trắng hiện tại j, để loại bỏ ký tự trắng liên tiếp.
  4. Sau đó, giảm đi 1 (--i) để quay lại kiểm tra các ký tự trước ký tự vừa xóa, vì ký tự này có thể là ký tự trắng liên tiếp với ký tự trước đó.

2.2 Cho biết từ có độ dài lớn nhất có trong chuỗi và vị trí xuất hiện của chuỗi đó

  1. Duyệt qua từng ký tự trong chuỗi s, nếu ký tự thứ i không phải ký tự trắng
    • Thì tăng biến đếm.
    • Ngược lại kiểm tra nếu maxlength nhỏ hơn giá trị của dem thì gán maxlength bằng dem, và gán pos bằng i - dem (vị trí bắt đầu của từ trong chuỗi s). Đặt lại giá trị của dem về 0, để chuẩn bị đếm từ mới.
  2. Sau khi vòng lặp for kết thúc, kiểm tra lần cuối nếu maxlength nhỏ hơn giá trị của dem, thì gán maxlength bằng dem, và gán pos bằng n - dem ( cái này dùng để xác định vị trí bắt đầu của từ cuối cùng trong chuỗi s nếu từ lớn nhất nằm ở cuỗi chuỗi).
  3. Xuất ra màn hình từ có độ dài lớn nhất và vị trí.

2.3 Thay thế tất cả các từ gốc x đang có trong chuỗi bằng từ mới y

Chi tiết lời giải tại đây: Tìm kiếm và thay thế ký tự trong chuỗi

2.4 Đảo ngược thứ tự các từ có trong chuỗi và in ra màn hình chuỗi sau khi đảo ngược.

  • Duyệt chuỗi ký tự từ vị trí 0 đến vị trí giữa chuỗi strlen(s)/2 vì chỉ cần đảo ngược nửa đầu tiền của chuỗi.
  • Thực hiện hoán đổi vị trí cuối chuỗi và vị trí đầu chuỗi.

3. Code chuẩn hoá chuỗi trong c

#include<iostream>
#include<iomanip>
#include<string.h>

using namespace std;

int main(){

    char s[255];
    int chon, i;

    do{
        cout<<" 1. Nhap chuoi ky tu"<<endl;
        cout<<" 2. Hien thi chuoi ky tu"<<endl;
        cout<<" 3. Chuan hoa chuoi ky tu"<<endl;
        cout<<" 4. Tu co do dai lon nhat"<<endl;
        cout<<" 5. Thay the chuoi"<<endl;
        cout<<" 6. Dao nguoc chuoi"<<endl;
        cin>>chon;

        switch(chon){
            case 1: {
                cout<<" Nhap chuoi ky tu: ";
                cin.ignore();
                cin.getline(s, 255);
                break;
            }

            case 2: {
                cout<<s<<endl;
                break;
            }

            case 3: {

                int length = strlen(s);
                // xoa khoang trang dau chuoi
                while(s[0]==' '){
                    for(int i=0;i<length;i++){
                        s[i]=s[i+1];
                    }
                }

                // xoa khoang trang cuoi chuoi
                while(length > 0 && s[length - 1] == ' '){
                        s[--length] ='\0';
                }

                // Xóa khoảng trắng thừa giữa các từ
                for (int i = 0; s[i] != '\0'; ++i) {
                    if (s[i] == ' ' && s[i + 1] == ' ') {
                        for (int j = i; s[j] != '\0'; ++j) {
                            s[j] = s[j + 1];
                        }
                        --i;
                    }
                }

                cout<<s<<endl;
                break;
            }

            case 4: {

                int maxlength = 0, pos =-1, dem=0;

                //Tìm độ dài của từ lớn nhất
                int n=strlen(s);
                for (int i=0;i<n;i++){
                    if(s[i]!=' '){
                        dem++;
                    }else{
                        if(maxlength<dem){
                            maxlength=dem;
                            pos=i-dem;
                        }
                        dem=0;
                    }
                }
                // xác dịnh lại độ cuối cùng nếu từ lớn nhất nằm ở cuối
                if (maxlength < dem) {
                    maxlength = dem;
                    pos = n - dem;
                }

                if (maxlength > 0) {
                    cout << "Tu co do dai lon nhat la: ";
                    for (int i = pos; i < pos + maxlength; i++) {
                        cout << s[i];
                    }
                    cout << endl;
                } else {
                    cout << "Khong co tu nao dau nhat." << endl;
                }

                cout<<"Vi tri: "<<pos<<endl;
                cout<<"Do dai tu lon nhat: "<<maxlength<<endl;
                break;

            }

            case 5: {
                char x, y;
                int redflag=0;

                cout<<" Nhap tu can thay the x: ";
                cin>>x;
                cout<<" Nhap tu can thay the y: ";
                cin>>y;
                //tìm và thay thế
                for(int i=0;i<strlen(s); i++){
                    if(s[i]==x){
                        redflag=1;
                        s[i]=y;
                    }
                }

                if(redflag==0){
                    cout<<" Khong tim thay x."<<endl;
                }

                cout<<s;
                break;
            }

            case 6: {
                // Đảo ngược chuỗi
                for(int i=0;i<strlen(s)/2;i++){
                    char temp = s[i];
                    s[i] = s[strlen(s) - i - 1];
                    s[strlen(s) - i - 1] = temp;
                }

                cout<<s;
                break;
            }
            case 0: {
                cout << "Thoat chuong trinh." << endl;
                break;
            }
            default: {
                cout << "Lua chon khong hop le. Vui long chon lai." << endl;
                break;
            }
        }
    }while(chon!=0);

    return 0;
}

4. Kết quả

– Nhập và hiển thị

– Chuẩn hoá và từ có độ dài lớn nhất

– Thay thế và đảo ngược

Trên đây là đoạn mã đơn giản để chuẩn hóa chuỗi ký tự bằng cách xóa các khoảng trắng thừa và chỉ giữ lại một ký tự trắng duy nhất giữa các từ. Cảm ơn các bạn đã theo dõi trên ttnguyen.net

Liên quan:

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em