输入带空格的字符串,求单词个数、
#include <stdio.h>
// 计算字符串长度的函数
size_t my_strlen(const char *str)
{
size_t len = 0;
while (str[len] != '\0')
{
++len;
}
return len;
}
int main()
{
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
// 如果存在换行符,则将其移除
size_t len = my_strlen(str);
if (len > 0 && str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
int state = 0; // 0: 在单词外, 1: 在单词内
int wordCount = 0;
const char *ptr = str;
while (*ptr) {
if (*ptr == ' ' || *ptr == '\t' || *ptr == '\n')
{
state = 0;
}
else if (state == 0)
{
state = 1;
++wordCount;
}
++ptr;
}
printf("单词个数: %d\n", wordCount);
return 0;
}
下面是对代码的详细解释:
1. my_strlen
函数
size_t my_strlen(const char *str)
{
size_t len = 0;
while (str[len] != '\0')
{
++len;
}
return len;
}
这个函数用于计算字符串的长度,即字符串中字符的数量(不包括终止符 \0
)。它通过遍历字符串直到遇到终止符 \0
来计算长度。
2. main
函数
int main()
{
char str[100];
printf("请输入一个字符串: ");
fgets(str, sizeof(str), stdin);
- 定义了一个字符数组
str
,大小为 100。 - 使用
fgets
从标准输入读取一行字符串并存储在str
中。fgets
会读取最多sizeof(str) - 1
个字符,并在末尾添加一个空字符\0
。
3. 移除换行符
size_t len = my_strlen(str);
if (len > 0 && str[len - 1] == '\n')
{
str[len - 1] = '\0';
}
- 调用
my_strlen
获取字符串的长度。 - 如果字符串的最后一个字符是换行符
\n
,则将其替换为空字符\0
,以去除换行符。
4. 计算单词数量
int state = 0; // 0: 在单词外, 1: 在单词内
int wordCount = 0;
const char *ptr = str;
while (*ptr) {
if (*ptr == ' ' || *ptr == '\t' || *ptr == '\n')
{
state = 0;
}
else if (state == 0)
{
state = 1;
++wordCount;
}
++ptr;
}
- 初始化状态变量
state
为 0,表示当前不在单词内。 - 初始化单词计数器
wordCount
为 0。 - 使用指针
ptr
遍历字符串。 - 如果当前字符是空格、制表符或换行符,将状态设置为 0(表示不在单词内)。
- 如果当前字符不是空白字符且状态为 0,说明遇到了一个新单词,将状态设置为 1,并增加单词计数器。
- 继续移动指针到下一个字符。
5. 输出结果
printf("单词个数: %d\n", wordCount);
return 0;
}
- 打印计算出的单词数量。
- 返回 0,表示程序正常结束。
总结
这段代码通过遍历用户输入的字符串,识别出其中的单词并统计其数量。主要步骤包括读取输入、去除换行符、遍历字符串并统计单词数量。