数单词个数的代码实现 gets与scanf的使用环境

帮朋友改程序时,起初朋友发给我的版本只对逻辑进行稍加修改,但发现其实有很大的不足

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int word = 1;//初始化单词的个数
	char a[999] = { 0 };
	int i = 0;//有单词情况下的下标
	(void)scanf("%s",a);

	if (a[0] == '\0')//什么都没有的情况
	{
		printf("There is nothing in the computer\n");
	}
	if (a[0] ==  ' ')//第一个字符为空格的情况
	{
		printf("The first word is just a blank");
	}
	i++;
	while (a[i] != '\0' ) //  '\0' =  0
	{
		if (a[i] == ' ')
		{
			word++;
		}
		i++;
	}
	printf("%d\n", word);

	return 0;
}

对以上程序进行测试发现如下几个问题
用scanf函数录入字符串很危险如下图在这里插入图片描述:录入字符串时发现字符串最开始的空格会被忽视,只录入了字母u,并且字母u后面的空格及内容也被忽视了在这里插入图片描述
为了保证结果的一致性又进行如上图的尝试

所以遇到无法完整录入英文句子的问题,思考到scanf函数录入字符串时遇到空格’ ',就会出现问题,所以选择使用另一种方法用gets函数输入字符串,于是很好的解决了这个问题,下面为不断完善的过程

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int word = 1;//初始化单词的个数
	char a[999] = { 0 };
	int i = 0;//有单词情况下的下标
	//(void)scanf("%s",a);
	gets(a);				//当用scanf函数接收字符串空格' '会被无视 得用gets()函数

	if (a[0] == '\0')//什么都没有的情况
	{
		printf("There is nothing in the computer\n");
	}
	if (a[0] ==  ' ')//第一个字符为空格的情况
	{
		printf("The first word is just a blank");
		word--;
	}
	i++;
	while (a[i] != '\0' ) //  '\0' =  0
	{
		if (a[i] == ' ' && a[i+1] != ' ')
		{
			word++;
		}
		i++;
	}
	printf("%d\n", word);

	return 0;
}

在这里插入图片描述
当使用了gets 函数对字符串录入时,便不会出现用scanf函数输入字符串出现的遇到空格’ '就输入不全的情况

最开始
在遍历字符串并判断是不是空格的判断语句是
if (a[i] == ’ ')
发现通过单词中间空格个数从而统计单词个数的方法有缺陷,就是当两个单词中间有对个空格的时候就会出现多统计的情况如下图:
在这里插入图片描述
输入的字符串算上结尾的!才六个单词但是由于单词之间有多个空格于是导致多数的情况发生只有保证每个单词中间是一个空格才能数对如下图:在这里插入图片描述

改为:
if (a[i] == ’ ’ && a[i+1] != ’ ')
即使字符串中两个相邻的单词中间有对个空格也不会多统计单词个数结果如下图:
在这里插入图片描述

还有就是最后加上了断言函数assert
断言字符串是否录入成功

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值