统计单词个数-C语言实现

统计单词个数-C语言实现

问题描述:

统计用户输入的句子中的单词的个数,比如:

input: hello world! I am the c.
output: 6


程序思想:

  1. 设置一个单词计数器:num

  2. 设置一个使能变量: numEnable,该使能变量的功能就是:
    2.1 当numEnable等于0的时候不能进行num++操作
    2.2 当numEnable非0时,则可以进行num++操作

  3. 初始时num=0, numEnable=1

  4. 遍历用户输入的字符串,遍历的过程中做如下处理:
    4.1 第一次遍历到26个字母时(不区分大小写),由于numEnable=1,因此执行num++,因为第一次遍历到字母说明这个字母一定是单词的首字母。接着就将numEnable=0,禁用程序计数器。

    4.2 直到遍历的字母不是26个字母的时候并且也不是'字符的时候才置numEnable=1,因为遇到这些字符的时候,说明下一个单词要开始了。这个时候就可以继续计数了。


上代码:

#include <stdio.h>

/*****************************************************
** describe: 
** 		判断当前字符c是不是属于26个字母,不论大小。
** param: 
** 		1) c: 带判断的字符。
** return:
** 		int: 如果c属于26个字母,那么就返回1,否则返回0
*****************************************************/
int
isAlphabet(char c) {
    return (c <= 'z' && c >= 'a') || (c <= 'Z' && c >= 'A');
}

/**********************************************************
** describe:
**		统计一个字符串中单词的个数(当然不确保单词是合法的单词)
**		比如:hhh, nihao 这也算是两个单词,虽然单词表里面没有。
** param:
** 		1) str: 待统计的字符串
** return: 返回str中单词的个数
***********************************************************/
int
wordNum(const char *str) {
    int numEnable = 1; // 计数器使能开关
    int num = 0; // 计数器

    char *cur = str; // cur指向当前正在遍历的字符
    // while 循环用于遍历字符
    while (*cur) {
        // 如果当前是字母
        if (isAlphabet(*cur)) {
            // 并且计数器使能开关是打开的,才可以计数
            if (numEnable) {
                num++;
                numEnable = 0; 
            }
        }else {
            // 仅当遍历到的字符不是26个字母并且不是'时,才开启计数器使能开关
            if (!isAlphabet(*cur) && *cur != '\'')
                numEnable = 1;
        }
        // 遍历下一个字符
        cur++;
    }

    return num;
}

int main(void) {
    const char *s = "   hello, let's go!!!   ";
    printf("%d\n", wordNum(s));
    return 0;
}

程序运行结果:

在这里插入图片描述

<think>嗯,用户想用C语言统计单词个数。我得先理清楚这个问题怎么解决。首先,得确定什么是单词,通常来说,单词是由字母组成,由空格、标点或换行分隔的字符串。但用户可能指的是简单的空格分隔的情况。可能需要考虑多个空格的情况,或者开头结尾的空格。 接下来,我需要想算法。可能的思路是遍历字符串,当遇到非空格字符时,如果前面是空格或者这是字符串的开始,就认为是一个单词的开始。这时候计数器加一。但需要注意连续的空格,比如两个空格之间不算两个单词。 然后,具体怎么实现呢?可能需要用循环逐个字符检查。比如,设置一个标志位,标记当前是否在单词中。初始状态是不在单词中,当遇到一个非空格字符,并且之前的状态是不在单词中,就增加计数,并标记进入单词状态。如果遇到空格,则标记不在单词中。这样可以避免重复计数。 还要考虑边界情况,比如字符串开头就是单词,或者结尾没有空格的情况。例如“Hello world”有两个单词,但最后一个字符是字母,程序是否能正确识别? 另外,用户可能希望处理各种空白字符,比如制表符或换行符,但题目中可能默认以空格分隔。或者是否需要处理标点符号?比如“Hello,world!”是否算两个单词?这时候可能需要更复杂的逻辑,比如检查是否是字母来判断单词的边界。不过用户的问题可能比较简单,假设单词由空格分隔。 那具体的代码结构呢?主函数可能需要读取输入字符串,或者从文件读取。例如,用户可能希望从标准输入读取一行文字,统计其中的单词数。或者可能希望从文件中读取。不过题目中没有说明输入来源,所以可能假设用户输入一个字符串。 例如,代码的大致流程: 初始化计数器为0,设置一个in_word标志为0(假)。 遍历每个字符: 如果当前字符不是空格且in_word为假,则计数器加一,in_word设为真。 如果当前字符是空格,in_word设为假。 其他情况(即当前字符不是空格,但in_word为真),继续。 这样就能正确统计单词数目了。 测试例子:比如输入“ Hello world this is a test ”,应该统计为6个单词。程序是否能正确处理开头和结尾的空格? 另外,需要注意字符串的结束符'\0',循环的条件应该是直到遇到'\0'。 可能还需要考虑其他情况,比如字符串全为空格,应该返回0。或者空字符串也返回0。 现在把这些逻辑写成代码。例如: #include <stdio.h> int count_words(const char *str) { int count = 0; int in_word = 0; while (*str) { if (*str != ' ') { if (!in_word) { count++; in_word = 1; } } else { in_word = 0; } str++; } return count; } int main() { char input[1000]; printf("请输入字符串:"); fgets(input, sizeof(input), stdin); // 去掉换行符,因为fgets会包含回车 input[strcspn(input, "\n")] = '\0'; int word_count = count_words(input); printf("单词个数:%d\n", word_count); return 0; } 不过,这里可能有一个问题:如果用户输入字符串中有多个空格、制表符或其他空白字符,比如用tab分隔,当前的代码只检查空格,可能不够。这时候可能需要用isspace函数,但需要包含ctype.h,并且检查是否是任何空白字符。 比如修改条件为: if (!isspace(*str)) { 但这样的话,需要将条件改为: #include <ctype.h> 然后判断当前字符是否为空白字符。比如: if (isspace(*str)) { in_word = 0; } else { if (!in_word) { count++; in_word = 1; } } 这样更全面。比如处理tab或者换行符的情况。 另外,用户可能希望将标点符号视为单词的分隔符。例如“hello,world”是否算两个单词?这时候可能需要将非字母数字的字符视为分隔符。但这个问题可能需要更复杂的处理,比如只将连续的字母视为一个单词。不过这可能超出用户的需求,用户可能只需要简单的空格分隔。 因此,是否需要考虑更复杂的分隔符?这个问题需要明确,但用户的问题可能只需要处理空格,所以先按空格处理。如果用户需要更复杂的处理,可能需要调整代码。 综上,正确的做法是遍历每个字符,用标志位跟踪是否在单词中,遇到非空格且不在单词时计数。同时,使用isspace来处理多种空白符更合理。</think>在C语言统计单词个数,通常通过检测空格或分隔符的切换来实现。以下是分步说明: --- ### **步骤1:理解单词定义** - **单词**:由非空白字符组成,被一个或多个空白字符(空格、制表符、换行符等)分隔的字符串- **示例**:`" Hello world\nC"` 包含3个单词("Hello", "world", "C")。 --- ### **步骤2:核心算法逻辑** 1. **初始化计数器**:`word_count = 0` 2. **状态标记**:`in_word = 0`(标记当前是否位于单词内) 3. **遍历每个字符**: - 如果当前字符**不是空白**且**不在单词内**: - 单词计数器 `word_count++` - 标记 `in_word = 1` - 如果当前字符**是空白**: - 标记 `in_word = 0` --- ### **步骤3:代码实现** ```c #include <stdio.h> #include <ctype.h> // 用于isspace函数 int count_words(const char *str) { int word_count = 0; int in_word = 0; // 0表示当前不在单词内 while (*str) { if (!isspace(*str)) { // 当前字符非空白 if (!in_word) { // 如果之前不在单词内 word_count++; // 发现新单词 in_word = 1; // 进入单词状态 } } else { // 当前字符是空白 in_word = 0; // 离开单词状态 } str++; // 检查下一个字符 } return word_count; } int main() { char input[] = " Hello world\nThis is a test "; printf("单词个数:%d\n", count_words(input)); return 0; } ``` --- ### **步骤4:代码解释** 1. **`isspace`函数**:检测字符是否为空白(包括空格、`\t`、`\n`等)。 2. **遍历字符串**:通过指针逐个检查字符,直到遇到结束符 `\0`。 3. **状态切换**: - 遇到非空白字符且不在单词内 → 新单词开始,计数器+1。 - 遇到空白字符 → 标记离开单词状态。 --- ### **步骤5:测试用例** - **输入**:`" Hello world\nC"` → **输出**:3 - **输入**:`""`(空字符串) → **输出**:0 - **输入**:`" "`(全空白) → **输出**:0 --- ### **注意事项** 1. **多行输入**:代码已通过`\n`正确处理换行符。 2. **标点符号**:若需将标点视为单词一部分(如`"hello,world"`算1个单词),需调整逻辑,比如检查字母或数字。 --- 通过上述方法,可高效统计字符串中的单词个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值