输入一行字符,统计有多少单词

题目:

        输入一行字符,统计其中有多少单词,(所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个,句首也可以有空格)。例如,输入:How are you,输出结果:word=3,程序命名为L6-5.c。(大家验证时至少验证两种情况并截图,例如:1句首无空格,句中多空格;2句首有空格,句中多空格;3.满足1.2的同时句尾也有多个空格)

思路:

        1.以How are you为例,可分为题目要求的三种情况

        2.计算单词的个数:

假设1:

        假如How are you ,句首无空格,每个单词后面都有空格,而且空格个数都为一个,那么,只需要计算空格的个数,即为单词个数;

再假设2:

        假如How are you ,句首无空格,每个单词后面都有空格,并且空格个数为多个,那个只需要,每次从左到右检索出空格后,把紧挨的空格全部清除,每次这个过程word就增加1;

假设3:

        假如How are you ,句首有空格,每个单词后面都有多个空格,那么只需要先把开始的空格全部清除,剩下的按假设2操作,即可得到结果

假设4:

        假如How are you ,句首有空格,每个单词(除了最后一个单词)后面都有多个空格,那么需要对最后一次检索到的连续空格进行清除,得到最后一个空格后面的字符,判断是否是字母即可

真是情形:

        不知道句首、句尾和居中各种情况的空格,所以要对句首、句尾都要进行判断。句首有空格就清除,从第一个单词的后面开始检索;句尾不知道是否有空格,也就是最后一次检索到的空格串不知到后面跟的有没有单词,那么就要对最后一次的空格处理,得到空格后紧挨着的是不是单词,是word就加1不是就不加

也就是假设4的代码

代码

情况1:

#include<stdio.h>
int main()
{
	char arr[200];
	int word = 0;//对单词个数初始化
	int sz = sizeof(arr) / sizeof(arr[0]) - 1;
//求数组的长度,减1是因为,数组的下标是从0开始的 0-199 共200个
	gets(arr);//输入字符串how are you ,you后还有一个空格
	int i = 0;
	for (i = 0; i <= sz; i++)
	{
		if (arr[i] == ' ')
		{
			word++;
		}
	}
	printf("%d\n", word);//此时word为3
	return 0;
}

情况2:

#include<stdio.h>
int main()
{
	char arr[200];
	int word = 0;//对单词个数初始化
	int sz = sizeof(arr) / sizeof(arr[0]) - 1;
    //求数组的长度,减1是因为,数组的下标是从0开始的 0-199 共200个
	gets(arr);//输入字符串how    are   you  ,每个单词后跟未知的多个空格
	int i = 0;
	for (i = 0; i <= sz; i++)
	{
		if (arr[i] == ' ')
		{
			word++;
		}
		while (arr[i] == ' ')//由于不知道有多少空格,所以循环次数未知,所以用while
		{
			i++;//清除连续的空格,使得一串连续的空格word只加1
		}
	}
	printf("%d\n", word);//word此时为3
	return 0;
}

情况3:

#include<stdio.h>
int main()
{
	char arr[200];
	int word = 0;//对单词个数初始化
	int sz = sizeof(arr) / sizeof(arr[0]) - 1;
//求数组的长度,减1是因为,数组的下标是从0开始的 0-199 共200个
	gets(arr);//输入字符串how    are   you  ,每个单词后跟未知的多个空格
	int i = 0;
	while (arr[i] == ' ')//对句首的空格进行清除
	{
		i++;
	}
	for (; i <= sz; i++)//for()中不再对i进行初始化,顺着之前的代码i的大小接着往下检索
	{
		if (arr[i] == ' ')
		{
			word++;
		}
		while (arr[i] == ' ')//由于不知道有多少空格,所以循环次数未知,所以用while
		{
			i++;
		}
	}
	printf("%d\n", word);//word此时为3
	return 0;
}

情况4:

#include<stdio.h>
int main()
{
	char arr[200];
	int word = 0;//对单词个数初始化
	int sz = sizeof(arr) / sizeof(arr[0]) - 1;
        //求数组的长度,减1是因为,数组的下标是从0开始的 0-199 共200个
	gets(arr);//输入字符串how    are   you  ,每个单词后跟未知的多个空格
	int i = 0;
	while (arr[i] == ' ')
	{
		i++;
	}
	int p = 0;
	for (; i <= sz-1; i++)
		//sz-1是防止最后单词后有一个空格,被循环后,下面的p++代码容易越界
        //也就是sz不减1时,i能循环到199,那么后面依旧会检索最后一次的空格,
        //那么最后一次p=i,即p=199,
        //后面的p++;操作就会超过数组长度,发生数组的越界 
	{
		if (arr[i] == ' ')
		{
			word++;
			p = i;//记录最后一次检索到空格时数组的下标
		}
		while (arr[i] == ' ')//由于不知道有多少空格,所以循环次数未知,所以用while
		{
			i++;
		}
	}
	while (arr[p] == ' ')
	{
		p++;//得到最后一次检索到的空格后紧挨的数组下标
	}

	if (((arr[p] >= 'a') && (arr[p] <= 'z')) || ((arr[p] >= 'A') && (arr[p] <= 'Z')))
		//对最后一个空格串后面的进行判断
		word += 1;

	printf("%d\n", word);//word此时为3
	return 0;
}

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值