Description

给定一句话,长度不超过1000,请你看看里面有几个单词,单词均为大小写字母构成,单词间会有一个或多个空格等非字母隔开

Input

只有一个字符串

Output

输出单词的个数

Sample Input 1 

Hello World!

Sample Output 1

2

坑点是开头。。

#include <iostream>
#include <string> 
#include <cstring>
using namespace std;
int main()
{
	string str;
	getline(cin,str);
	int flag=0,cnt=0;
	for(int i=0;i<str.length();i++)
	{
		if(str[i]>'z'||str[i]<'A'||(str[i]>'Z'&&str[i]<'a'))
		{
			flag=0;
		}
		else if(flag==0)
		{
			flag=1;
			cnt++;//一个单词计数完改flag 遇到空格其他字符会继续变 
		}
	}cout<<cnt<<endl;
	return 0;
}

还有一种

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	int cnt=0;
	if((s[0]>='a'&&s[0]<='z')||(s[0]>='A'&&s[0]<='Z'))
	{
		cnt=1;
	 } else cnt=0;
	 for(int i=1;i<s.length();i++)
	 {
	 	if(s[i-1]==' '&&((s[i]>='a'&&s[i]<='z')||s[i]>='A'&&s[i]<='Z'))
	 	{
	 		cnt++;
		  } 
	 }cout<<cnt<<endl;
	 return 0;
}

zxy大神的代码


#include<cstdio>
#include<cstring>
#include<cctype>
char s[1005];
int main()
{
    fgets(s,sizeof(s),stdin);//fgets()是安全的,因为不会像gets()有溢出的可能。。
    int len = strlen(s);
    int flag = 1;
    int cnt = 0;
    for(int i = 0;i < len; ++i)
    {
        if(isalpha(s[i]))
        {
            if(flag)
            {
                cnt++;
                flag = 0;
            }
        }
        else flag = 1;
    }
    printf("%d\n",cnt);
    return 0;
}