C语言如何实现字符串单词个数统计
本文介绍使用C语言统计一行字符串中单词个数的方法。核心思路是通过空格判断单词边界:当检测到非空格字符且前一个字符为空格时,计数器加1。文章详细解析了flag标志位的用法、N-S流程图、完整源代码及运行结果示例,适合C语言初学者理解字符遍历与状态判断。
问题分析
在C语言中处理文本数据时,经常需要统计字符串内的单词数量。所谓“单词”,通常指由空格分隔的连续字符序列。题目要求输入一行包含空格的字符串,程序需准确识别并输出其中的单词总数。
输入样例:
I want to be a postgraduate.
输出样例:
There are 6 words in this line.
算法设计
统计单词数量的关键在于识别“新单词”的开始。一个简单的策略是利用空格作为分隔符,但需注意连续空格和行首空格的情况。
- 状态标记(flag):引入一个变量
flag记录当前字符前的字符状态。
flag = 0:表示前一个字符是空格(或者位于字符串开头,视作遇到空格后的开始)。flag = 1:表示前一个字符是非空格。
- 遍历逻辑:逐个读取字符串中的字符
c:
- 如果
c是空格:更新flag = 0,意味着接下来的非空格字符将是新单词的开始。 - 如果
c不是空格:
- 若此时
flag == 0:说明刚从前一个空格或非初始状态进入到了新单词的第一个字符,单词数count加1,同时置flag = 1。 - 若此时
flag == 1:说明仍在上一个单词内部,不执行任何操作。
- 若此时
- 如果
这种方法的本质是统计“从空格变为非空格”的切换次数。初始化时 flag=0,确保第一个非空格字符能被正确计数为第一个单词。
N-S图示意:
C语言代码实现
以下是完整的C语言源代码。请注意,为了获取整行输入(包含空格),这里使用了 gets 函数(在现代标准中建议优先使用 fgets 以避免缓冲区溢出风险,但此处沿用原题解法以保持一致性)。
/*
* C语言实现统计一行字符串的单词个数
*/
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[81]; // 定义字符数组存储输入字符串,最大长度80加上结束符\0
int i, count = 0, flag = 0; // count记录单词数,flag记录前一字符状态
char c;
// 读取用户输入的一行字符串
// 注意:实际工程中建议使用 fgets(string, sizeof(string), stdin);
gets(string);
// 遍历字符串直到遇到结束符 '\0'
for(i=0; (c = string[i]) != '\0'; i++)
{
if(c == ' ') {
// 当前字符是空格,标记前一个是空格(或当前也是空格)
flag = 0;
} else if(flag == 0) {
// 当前字符非空格,且前一个字符是空格
// 这意味着遇到了一个新单词的开始
flag = 1; // 更新状态:当前字符后跟着的是非空格
count++; // 单词计数器加1
}
}
printf("There are %d words in this line.\n", count);
return 0;
}
关键逻辑解析
- 循环入口:初始化时
i=0,第一个字符被赋给c。假设输入第一个字符是字母(如 'I'),它不是空格,进入else if(flag == 0)分支,因为初始flag=0,所以count变为1。这符合直觉:行首的非空格字符即为第一个单词。 - 连续空格处理:如果遇到多个空格,
c==' '持续将flag设为0,只有当再次遇到非空格字符时,才会触发count++,从而忽略多余的空格间隔。
测试结果
编译并运行上述代码,输入样例字符串:
I want to be a postgraduate.
程序输出如下:
There are 6 words in this line.
运行截图参考:
总结
通过维护一个状态标志位 flag,我们可以高效地检测字符串中文本段落的转换点。这种方法避免了复杂的状态机结构,代码简洁且逻辑清晰,是解决基础文本统计问题的经典范式。以上就是C语言实现统计一行字符串的单词个数的详细内容,更多关于C语言字符串处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









