Bài tập thực hành con trỏ C++ - Xử lý chuỗi ký tự

Bài 1: Loại bỏ khoảng trắng ở đầu và cuối chuỗi

#include <iostream>
using namespace std;

char* xoaKhoangTrang(char* chuoi);
int main()
{
    char s[1024];  // Khai báo mảng ký tự một chiều để lưu chuỗi
    // Nhập một dòng ký tự, có thể chứa khoảng trắng
    // Chuỗi nhập được lưu vào s, đọc tối đa 1024 ký tự, tự động thêm '\0' ở cuối
    cin.getline(s, 1024);
    cout << xoaKhoangTrang(s) << endl;  // Xuất chuỗi sau khi loại bỏ khoảng trắng đầu và cuối
    return 0;
}
// Hàm xoaKhoangTrang: loại bỏ khoảng trắng ở đầu và cuối chuỗi
// Tham số: chuoi - con trỏ ký tự, trỏ đến chuỗi đầu vào
// Giá trị trả về: con trỏ ký tự, trỏ đến chuỗi sau khi loại bỏ khoảng trắng (địa chỉ bắt đầu)
// Gợi ý: có thể thao tác trực tiếp trên chuỗi chuoi
char* xoaKhoangTrang(char* chuoi)
{
    // Vui lòng thêm mã ở đây để triển khai hàm xoaKhoangTrang
    /********** Bắt đầu *********/
    if (chuoi == nullptr)
        return chuoi;
    // Loại bỏ khoảng trắng đầu chuỗi
    char* batDau = chuoi;
    while (*batDau == ' ')
        batDau++;
    // Loại bỏ khoảng trắng cuối chuỗi
    char* ketThuc = batDau;
    while (*ketThuc != '\0')
        ketThuc++;
    ketThuc--;
    while (ketThuc >= batDau && *ketThuc == ' ')
        ketThuc--;
    // Điều chỉnh độ dài chuỗi và thêm '\0' ở cuối
    *(ketThuc + 1) = '\0';
    // Trả về địa chỉ bắt đầu chuỗi đã xử lý
    return batDau;
    /********** Kết thúc **********/
}

Bài 2: Lọc ra các chữ số trong chuỗi

#include <iostream>
using namespace std;

void locSo(char* chuoi);
int main()
{
    char s[1024];
    cin.getline(s, 1024);  // Nhập một dòng ký tự
    locSo(s);  // Gọi hàm locSo, lọc ra các chữ số
    cout << s << endl;  // Xuất các chữ số đã lọc
    return 0;
}
// Hàm locSo: lọc ra các chữ số trong chuỗi được trỏ bởi str và ghi lại vào str
// Tham số: str - con trỏ trỏ đến chuỗi
void locSo(char* chuoi)
{
    // Vui lòng thêm mã ở đây để triển khai hàm locSo
    /********** Bắt đầu *********/
    char* p = chuoi, *q = chuoi;
    int dauHieu = 1;
    while (*q != '\0') {
        if (*q == '-' && dauHieu) {
            *p++ = *q++;
            dauHieu = 0;
        } else if (*q >= '0' && *q <= '9') {
            dauHieu = 0;
            *p++ = *q++;
        } else {
            q++;
        }
    }
    *p = '\0';
    /********** Kết thúc **********/
}

Bài 3: Đếm số lần xuất hiện của chuỗi con

#include <string.h>
#include <iostream>
using namespace std;

int demXuatHien(char* chuoiCon, char* chuoiLon);
int main()
{
    char sub[128], str[1024];
    cin.getline(sub, 128);  // Nhập chuỗi con
    cin.getline(str, 1024);  // Nhập chuỗi dài
    int n = demXuatHien(sub, str);  // Gọi hàm demXuatHien, tính số lần xuất hiện của chuỗi con trong chuỗi dài
    cout << n << endl;  // Xuất số lần
    return 0;
}
// Hàm demXuatHien: tính số lần xuất hiện của chuỗi con trong chuỗi dài
// Tham số: chuoiCon - con trỏ trỏ đến chuỗi con, chuoiLon - con trỏ trỏ đến chuỗi dài
// Giá trị trả về: số lần xuất hiện
int demXuatHien(char* chuoiCon, char* chuoiLon)
{
    // Vui lòng thêm mã ở đây để triển khai hàm demXuatHien
    /********** Bắt đầu *********/
    int dem = 0;
    char* viTri = chuoiLon;
    while (*viTri != '\0') {
        if (strstr(viTri, chuoiCon) != NULL) {
            dem++;
            viTri = strstr(viTri, chuoiCon);
            viTri += strlen(chuoiCon);
        } else {
            viTri++;
        }
    }
    return dem;
    /********** Kết thúc **********/
}

Bài 4: Sao chép một phần chuỗi

#include <iostream>
using namespace std;

void saoChepPhanTu(char* nguon, int viTriBatDau, int soKyTu, char* dich);
int main()
{
    char s[128], t[128];
    int m, n;
    cin >> s;  // Nhập chuỗi nguồn
    cin >> m >> n;  // Nhập m và n
    saoChepPhanTu(s, m, n, t);  // Sao chép chuỗi
    cout << t << endl;  // Xuất kết quả sao chép
    return 0;
}
// Hàm saoChepPhanTu: sao chép một phần chuỗi, sao chép n ký tự bắt đầu từ vị trí m của chuỗi được trỏ bởi s vào t
// Tham số: s - con trỏ trỏ đến chuỗi nguồn, t - con trỏ trỏ đến chuỗi đích, m - vị trí bắt đầu, n - số ký tự
// Giá trị trả về: không có
void saoChepPhanTu(char* nguon, int viTriBatDau, int soKyTu, char* dich)
{
    // Vui lòng thêm mã ở đây để triển khai hàm saoChepPhanTu
    /********** Bắt đầu *********/
    char* p = nguon;
    char* q = dich;
    int i = 0;
    p = p + viTriBatDau;
    while (i < soKyTu) {
        *q++ = *p++;
        i++;
    }
    *q = '\0';
    /********** Kết thúc **********/
}

Thẻ: C++ con trỏ xử lý chuỗi algorithm string manipulation

Đăng vào ngày 12 tháng 6 lúc 20:59