输入一段带空格的宇符串 (以‘.’结尾),判断其中的单词有多少个。
提示:只要是连续的纯英文字符即为单词,其他不算单词。
输入示例:This is abc Lab 1234 234b.
输出示例:其有4个单词
通过getchar逐个字符接收,遇到空格判断是否单词
#include <stdio.h>
int main()
{
char c;
int cnum = 0,count= 0 ;
while((c=getchar()) != '.')
{
if(c==' ')
{
if(cnum > 0)
count++;
cnum = 0;
}
else if((c>='a' && c<='z') || ( c>='A' && c<='Z'))
{
if(cnum >= 0)
cnum++;
}
else
{
cnum = -1;
}
}
if(cnum > 0)
count++;
printf("%d",count);
return 0;
}
分别对每个小字符串统计字母个数看是不是等于下标之差,依次来判断是不是单词
#include <stdio.h>
int main()
{
int i,j=0,num=0,f=0;
char s[200];
gets(s);
for(i=0; s[i]!='.'; i++)
{
if((s[i]>='a' && s[i]<='z') || (s [i]>='A' && s[i]<='Z'))
f++;
if((s[i]==' ')&&(i-j)==f)
{
f=0;
num++;
j=i+1;
}
}
printf("%d",num);
return 0;
}
几个测试结果:
代码如下,代码里几乎每一行都有注释:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 0; //记录单词数量
int flag = 1; //状态,是否已经开始判定,以空格是否出现为标记,刚开始时标记为1
int flag_char = 0; //状态位,记录是否已经开始出现字母
char ch;
while (1)
{
ch = getchar();
if (flag == 1)//表示开始判定字符
{
if (flag_char == 1)
{
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
continue;
else if (ch == ' ') //出现空格,表示上一个单词结束,开始下一个单词
{
n++; //单词数+1
flag = 1; //开始记录
flag_char = 0; //重置字母出现标记
}
else if (ch == '.')
{
n++; //单词数+1
flag = 1; //开始记录
flag_char = 0; //重置字母出现标记
break;//结束循环
}
else
{
flag = 0;//出现了其它字符,表示非单词,重置记录标志
flag_char = 0;
}
}
else
{
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
flag_char = 1;
else if (ch == ' ')
continue;
else if (ch == '.')
break;
else
{
flag = 0; //出现其它字符,说明非单词
flag_char = 0;
}
}
}
else //还没开始判定,出现的任何字母、数字都被忽略,直到出现空格和. 出现空格表示可以开始判定了,出现.表示需要结束读取了
{
if (ch == ' ') //出现空格,开始判定
{
flag = 1;
flag_char = 0;
}
else if (ch == '.')//出现. 结束读取
break;
else
continue; //其它字符,继续读取,直到出现空格为止
}
}
printf("%d", n);
return 0;
}