Bài 61. Đếm số từ trong chuỗi C/C++
Tiếp tục là các bài tập giúp các bạn luyện tập tri thức về chuỗi và xử lý chuỗi trong C. Hôm nay tất cả chúng ta cùng nhau đi khắc phục 1 bài tập về xử lý chuỗi: đếm số từ trong chuỗi nhập từ keyboard sử dụng C/C++. Đồng thời, tất cả chúng ta cũng sẽ khắc phục bài toán chuẩn hóa chuỗi luôn nhé.
Table of Contents
Bài tập đếm số từ trong chuỗi
- Nhập vào một chuỗi từ keyboard
- Đế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 trước nhất, các chữ cái còn lại viết thường
- In ra số từ và xâu sau thời điểm chuẩn hóa
Input:
1
2
Nhap chuoi: LAP trINH khong KHO!
Output:
1
2
3
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à khởi đầu của 1 từ.
Lưu ý: Có thể từ trước nhất không khởi đầu bằng dấu cách.
1
2
3
4
5
6
7
8
9
10
11
12
13
int
WordCount
(
char
str
[
]
,
int
length
)
{
int
word
=
(
str
[
]
!
=
‘ ‘
)
;
for
(
int
i
=
;
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 trước nhất của chuỗi
- Bỏ qua các khoảng trắng thừa ở giữa
- Mang toàn bộ về lowercase
- Viết hoa chữ cái xuất phát điểm 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
36
void
Correct
(
char
str
[
]
,
int
length
)
{
int
first
=
,
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 trước nhất
if
(
str
[
first
]
>
=
‘a’
&& str[first] <= ‘z’)
str[first] -= 32;
for
(
int
i
=
first
+
1
;
i
<
=
last
;
i
++
)
{
// Mang 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
67
#include <stdio.handgt;
#include <string.handgt;
int
WordCount
(
char
str
[
]
,
int
length
)
{
int
word
=
(
str
[
]
!
=
‘ ‘
)
;
for
(
int
i
=
;
i
<
length
–
1
;
i
++
)
{
if
(
str
[
i
]
==
‘ ‘
&& str[i + 1] != ‘ ‘)
{
word++;
}
}
return
word
;
}
void
Correct
(
char
str
[
]
,
int
length
)
{
int
first
=
,
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 trước nhất
if
(
str
[
first
]
>
=
‘a’
&& str[first] <= ‘z’)
str[first] -= 32;
for
(
int
i
=
first
+
1
;
i
<
=
last
;
i
++
)
{
// Mang 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 tất cả chúng ta sẽ đọc cả ký tự ‘n’.
// Xóa bỏ nó đi.
int
length
=
strlen
(
str
)
–
1
;
str
[
length
]
=
‘