Tiếp tục là các bài tập giúp các bạn luyện tập kiến thức về chuỗi và xử lý chuỗi trong C. Hôm nay chúng ta cùng nhau đi giải quyết 1 bài tập về xử lý chuỗi: đếm số từ trong chuỗi nhập từ bàn phím sử dụng C/C++. Đồng thời, chúng ta cũng sẽ giải quyết bài toán chuẩn hóa chuỗi luôn nhé.
Bài tập đếm số từ trong chuỗi
- Nhập vào một chuỗi từ bàn phím
- Đếm số từ có trong chuỗi vừa nhập
- Xóa bỏ khoảng trắng ở đầu, giữa và cuối chuỗi
- Viết hoa chữ cái đầu tiên, các chữ cái còn lại viết thường
- In ra số từ và xâu sau khi chuẩn hóa
Input:
1 |
Nhap chuoi: LAP trINH khong KHO! |
Output:
1 2 |
So tu cua " LAP trINH khong KHO!" la 4 Xau chuan hoa la: Lap trinh khong kho! |
Cách đếm số từ trong chuỗi
Ý tưởng: Nếu ký tự hiện tại là dấu cách và ký tự tiếp theo không phải dấu cách thì ta coi đó là bắt đầu của 1 từ.
Lưu ý: Có thể từ đầu tiên không bắt đầu bằng dấu cách.
1 2 3 4 5 6 7 8 9 10 11 12 |
int WordCount(char str[], int length) { int word = (str[0] != ' '); for (int i = 0; i < length - 1; i++) { if (str[i] == ' ' && str[i + 1] != ' ') { word++; } } return word; } |
Chuẩn hóa chuỗi trong C
Ý tưởng chuẩn hóa chuỗi trong C như sau:
- Bỏ các ký tự khoảng trắng thừa ở đầu chuỗi
- Bỏ các ký tự khoảng trắng thừa ở cuối chuỗi
- Viết hoa chữ cái đầu tiên của chuỗi
- Bỏ qua các khoảng trắng thừa ở giữa
- Đưa tất cả về lowercase
- Viết hoa chữ cái bắt đầu từ theo ý tưởng đếm từ phía trên
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void Correct(char str[], int length) { int first = 0, last = length - 1; // Xóa dấu trắng đầu chuỗi while (first < last && str[first] == ' ') first++; // Xóa dấu trắng cuối chuỗi while (last > first && str[last] == ' ') last--; // Viết hoa chữ cái đầu tiên if (str[first] >= 'a' && str[first] <= 'z') str[first] -= 32; for (int i = first + 1; i <= last; i++) { // Đưa hết về chữ thường if (str[i] >= 'A' && str[i] <= 'Z'){ str[i] += 32; } if (i + 1 <= last) { // Bỏ dấu trắng thừa ở giữa if (str[i] == str[i + 1] && str[i] == ' ') { continue; } // Nếu là chữ cái đầu mỗi từ thì viết hoa if (str[i] == ' ' && str[i + 1] >= 'a' && str[i + 1] <= 'z') { str[i + 1] -= 32; } } printf("%c", str[i]); } } |
Lời giải chuẩn hóa chuỗi và đếm số từ trong C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <stdio.h> #include <string.h> int WordCount(char str[], int length) { int word = (str[0] != ' '); for (int i = 0; i < length - 1; i++) { if (str[i] == ' ' && str[i + 1] != ' ') { word++; } } return word; } void Correct(char str[], int length) { int first = 0, last = length - 1; // Xóa dấu trắng đầu chuỗi while (first < last && str[first] == ' ') first++; // Xóa dấu trắng cuối chuỗi while (last > first && str[last] == ' ') last--; // Viết hoa chữ cái đầu tiên if (str[first] >= 'a' && str[first] <= 'z') str[first] -= 32; for (int i = first + 1; i <= last; i++) { // Đưa hết về chữ thường if (str[i] >= 'A' && str[i] <= 'Z'){ str[i] += 32; } if (i + 1 <= last) { // Bỏ dấu trắng thừa ở giữa if (str[i] == str[i + 1] && str[i] == ' ') { continue; } // Nếu là chữ cái đầu mỗi từ thì viết hoa if (str[i] == ' ' && str[i + 1] >= 'a' && str[i + 1] <= 'z') { str[i + 1] -= 32; } } printf("%c", str[i]); } } int main() { char str[100]; // Nhập chuỗi printf("\nNhap chuoi: "); fgets(str, sizeof str, stdin); // Do sử dụng fgets nên chuỗi của chúng ta sẽ đọc cả ký tự '\n'. // Xóa bỏ nó đi. int length = strlen(str) - 1; str[length] = '\0'; printf("So tu cua \"%s\" la %d", str, WordCount(str, length)); printf("\nXau chuan hoa la: "); Correct(str, length); } |
Kết quả chạy thử:
1 2 3 4 5 6 |
PS G:\c_cources\day_61> g++ .\ChuanHoa.cpp -o .\ChuanHoa PS G:\c_cources\day_61> .\ChuanHoa.exe Nhap chuoi: LAP trINH khong KHO! So tu cua " LAP trINH khong KHO!" la 4 Xau chuan hoa la: Lap trinh khong kho |
Theo dõi lập trình không khó tại: