转自:http://blog.csdn.net/bichenggui/archive/2009/05/26/4217663.aspx
这是一个很常见的笔试题目。
给出我的解法:
算法思路:
该算法需要一个bool值,用来防止word被重复计算,flag初始值为假。
遍历该字符串,
如果字符为字母或数字(组成单词的一部分),如果flag为假,则结果加1,并将flag变成真。
如果字符串为分隔符,则把flag设为假。
//判断是否为分隔符
bool IsSeperator(char c)
{
switch(c)
{
case ' ':
return true;
break;
case ',':
return true;
break;
case '!':
return true;
break;
case '?':
return true;
break;
case '.':
return true;
break;
case '/"':
return true;
break;
case '/n':
return true;
break;
case '/t':
return true;
break;
default:
return false;
break;
}
}
//判断是否为字母或数字
bool isLetter(char c)
{
if ( (c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122))
return true;
else
return false;
}
int CountWords(const char* source)
{
//input lines of words , and count the number of words
/* the seperator may be ' ' white space
'/t' tab
',' comma
'/n' newline
'?' question
';'
'!' quote
'/"'
*/
const char* p = source;
bool word = false;
int count = 0;
for (; *p != '/0'; ++p)
{
if ( isLetter(*p))
{
if (word == false)
{
count++;
word = true;
}
}
else if (IsSeperator(*p))
{
word = false;
}
}
return count;
}