帮朋友改程序时,起初朋友发给我的版本只对逻辑进行稍加修改,但发现其实有很大的不足
#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
断言字符串是否录入成功