#include <iostream>
#include <string>
#include <cctype>
size_t countwords(const char *);
using namespace std;
int main()
{
char a[] = "Four score and seven years ago";
float sum = 0.0;
char j[10];
string s;
int size = sizeof(a)/sizeof(char);
for(int i = 0; i < size; i++){
if(!isspace(a[i])){
s += a[i];
}
if(isspace(a[i]) and !isspace(a[i + 1])){
cout << s << " " << s.length() << endl;
sum += s.length();
s = "";
}
}
cout << countwords(a);
return 0;
}
size_t countwords( const char *s )
{
size_t count = 0;
while ( *s )
{
while ( isspace( *s )) ++s;
if ( *s ) ++count;
while ( isalnum( *s )) ++s;
}
return ( count );
}
在主要功能中,我可以打印每个单词及其单词长度。例如四个4,得分5等。我在处理“前一个”的最后一个单词时遇到了麻烦。我不知道如何解释。任何帮助,将不胜感激。
输出:
Four 4
score 5
and 3
seven 5
years 5
▼ 2
6
是的,不知道为什么黑色三角形在输出中,但这是确切的输出。
答案 0 :(得分:1)
终止NULL字符不被视为whitespace,因此当遇到字符串结尾时,您的第二个if
条件会返回false
。
在我看来,for
声明中的陈述可以简化为
if(!isspace(a[i]) && a[i]){
s += a[i];
} else {
cout << s << " " << s.length() << endl;
sum += s.length();
s = "";
}
此外,使用istringstream
char a[] = "Four score and seven years ago";
std::istringstream ss(a);
std::string s;
while(ss >> s) {
std::cout << s << ' ' << s.length() << '\n';
}
答案 1 :(得分:1)
您尝试检查的字符串比预期长一个字符:
int size = sizeof(a)/sizeof(char);
此大小包括终止空字符。如果我要处理赋值,我将在char const*
上运算并使用C约定来检查终止空字符,或者我将数组转换为std::string
并处理迭代器并检查结束迭代器。我还认为你必须检查一个单词结尾的逻辑假定单词只用一个空格分隔。
您的countwords()
函数似乎处理C约定。在使用main()
之前,您的a[i]
函数应检查!isspace(static_cast<unsigned char>(a[0]))
是否为空:countwords()
有效,因为isspace(0)
和isalnum(0)
为false
。但是,仅仅因为0
不是空格,这意味着它是一个单词的一部分。您还应该将终止空字符视为单词分隔符,即报告单词长度的条件应为
if(!a[i] || isspace(static_cast<unsigned char>(a[i])))
答案 2 :(得分:0)
std::string word;
std::istringstream str(a);
while (str >> word) {
sum += str.length();
std::cout << word << ' ' << word.length << '\n';
}