计算字符串中的单个字长

时间:2013-12-02 23:26:50

标签: c++ string

#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

是的,不知道为什么黑色三角形在输出中,但这是确切的输出。

3 个答案:

答案 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';
}