单词数

Problem Description

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

 

Input

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

 

Output

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

 

Sample Input

you are my friend

#

 

Sample Output

4

 

Solution

#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
	char shuzu[1000];
	char shuzu2[50][20];
	while(gets(shuzu))
	{
		if(shuzu[0] == '#')
			break;
		else if(shuzu == '\0')
			printf("0\n");
		else
		{
			int a,b,c,d;
			b = 0,c = 0;
			for(a = 0;a <= strlen(shuzu);++a)
			{
				if(shuzu[a] == ' '||shuzu[a] == '\0')
				{
					shuzu2[b][c] = '\0';
					c = 0;
					for(d = 0;d < b;++d)
						if(strcmp(shuzu2[d],shuzu2[b]) == 0)
							break;
					if(d == b && shuzu2[b][0] != '\0')
						++b;
				}
				else
				{
					shuzu2[b][c] = shuzu[a];
					++c;
				}
			}
			printf("%d\n",b);
		}
	}
	return 0;
}

注意特殊情况:

1.“                ” 0(测试中任意时刻输入一行空格,结果为0)
2.“   sa  zxc      ” 2(每个单词前,后,相邻间不止一个空格)
3.“   sa  zxc     v” 3
4."v  sa  zxc      ” 3(注意首尾可能只是一个字母)
5.任意时刻直接回车,结果为0.
<think>好的,我现在需要帮用户解决如何用C语言编写程序统计文本中的单词量的问题。首先,我得回想一下用户提供的引用内容,看看有没有相关的代码示例或者方法说明。 根据引用[2],提到统计一行文本的单词,输入一行字符,单词之间用空格分隔,可能有多个空格。这可能是一个基础的实现方法,通过检测空格来判断单词。但需要处理多个空格的情况。 引用[4]展示了一个据结构准备,使用了链表来存储单词的位置和次,不过这可能比较复杂,用户可能只需要基础的统计方法。 引用[5]中的代码可能需要通过命令行参传递文件名,但用户可能更倾向于从文件直接读取或者标准输入。 接下来,我需要整理一个简的方法。通常,统计单词的基本思路是检测单词的开始和结束。通常认为单词由空格、制表符或换行符分隔。每次从非空白字符到空白字符的转换时,单词增加。 需要注意的问题包括:多个连续空格的处理,开头或结尾的空格,以及空文件的情况。 现在,参考引用中的例子,可能需要提供一个不使用链表的基础版本,让用户更容易理解。例如,读取文件中的每个字符,当遇到非空白字符且前一个字符是空白时,单词加一。这需要维护一个状态变量,标记当前是否在单词中。 然后,编写代码的大致步骤是:打开文件,逐字符读取,判断是否是分隔符,更新状态和计器。最后关闭文件并输出结果。 需要处理的情况包括不同分隔符(空格、换行、制表符等),以及文件读取错误的情况。此外,考虑大小写是否敏感,但用户问题中没有提到,可能默认不需要处理,即区分大小写。 现在,结合这些思考,可以写一个简的C程序,使用标准库函,如fopen、fgetc等,并循环处理每个字符。初始化一个标志变量in_word为0,当遇到非空白且in_word为0时,计器加一,并设置in_word为1。当遇到空白时,设置in_word为0。 测试这个程序是否能正确处理多个空格、换行等情况。例如,输入" Hello world\nThis is a test\t"应该统计为6个单词。 然后,根据用户提供的引用,特别是引用[2]和[4],可能需要提到更复杂的情况,比如使用链表统计不同单词的出现次,但用户的问题可能只需要总,所以基础版本就够了。 最后,生成相关问题,比如如何处理大小写,如何统计不同单词的出现频率,或者如何处理标点符号等。</think>### C语言统计文本单词的方法 统计单词的核心逻辑是**检测单词分隔符的变化**。通常以空格、换行符或制表符作为分隔符,每次从分隔符跳转到非分隔符时计器加1。以下是两种实现方式: --- #### 方法1:基础版本(逐字符扫描) ```c #include <stdio.h> #include <ctype.h> int main() { FILE *file = fopen("text.txt", "r"); if (file == NULL) { printf("文件打开失败\n"); return 1; } int ch, word_count = 0, in_word = 0; while ((ch = fgetc(file)) != EOF) { if (isspace(ch)) { in_word = 0; // 当前处于分隔符状态 } else if (!in_word) { word_count++; // 从分隔符跳转到单词开头 in_word = 1; // 标记进入单词状态 } } fclose(file); printf("单词: %d\n", word_count); return 0; } ``` - **关键逻辑**:通过`isspace`函检测分隔符,`in_word`标记当前是否处于单词内部[^2]。 - **适用场景**:简文本统计,忽略标点符号影响。 --- #### 方法2:增强版(处理标点符号) 若需排除标点符号的影响(如将"word," 视为一个单词): ```c #include <stdio.h> #include <ctype.h> int is_word_char(int c) { return isalnum(c) || c == '_'; // 允许字母、字、下划线组成单词 } int main() { FILE *file = fopen("text.txt", "r"); if (!file) return 1; int ch, word_count = 0, in_word = 0; while ((ch = fgetc(file)) != EOF) { if (is_word_char(ch)) { if (!in_word) word_count++; in_word = 1; } else { in_word = 0; } } fclose(file); printf("单词: %d\n", word_count); return 0; } ``` - **改进点**:通过`is_word_char`自定义合法单词字符,避免将标点计入单词[^4]。 --- #### 操作步骤 1. 将代码保存为`word_count.c`。 2. 编译:`gcc word_count.c -o word_count`。 3. 运行:`./word_count`(需确保`text.txt`存在)[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值