Wordcount 函数无法将单词添加到一组唯一单词中

Wordcount function having trouble adding words to a set of unique words

我正在编写一个 wordcount 函数,它应该能够将元素从 stdin 读取到一个字符串中。然后评估字符串和 return 单词数、行数、字符串大小和唯一单词数。

我的问题是在向唯一集添加单词时。当我编写它来向集合中添加元素时,它会将空格计为单词的一部分,然后将其完全推入我的集合。 例子: 输入:

this is                                                                                                                                                                                                                                         
        is                                                                                                                                                                                                                                      
a test                                                                                                                                                                                                                                          
test 

输出

a                                                                                                                                                                                                                                               
test                                                                                                                                                                                                                                            
is test this                                                                                                                                                                                                                                    
line is 4                                                                                                                                                                                                                                       
Words = 7                                                                                                                                                                                                                                       
size is 27                                                                                                                                                                                                                                      
Unique is 6 

总共有7个单词,6个唯一。我尝试通过边走边打印代码位来调试它,这样我就可以跟踪哪里出错了。我只能得出结论,问题出在我的 if 循环中。我怎样才能克服这个问题,我已经被困了一段时间了。

这是我的代码:

#include<iostream>
#include<string>
#include<set>
using std::string;
using std::set;
using std::cin;
using std::cout;

set<string> UNIQUE;

size_t sfind(const string s) //will take string a count words, add to set
{
    string a;
    int linecount = 0;
    int state = 0;               //0 represents reading whitespace/tab, 1 = reading letter  
    int count = 0;              //word count
    for(size_t i =0; i < s.length(); i++) {
        a+=s[i];                                          //add to new string to add to set
        if(state ==0) {                                  //start at whitespace       
            if(state != ' ' && state != '\t') {         //we didnt read whitespace
                count++;
                state =1;
            }
        }
        else if(s[i]== ' ' || s[i] == '\t' || s[i] == '\n') {
            state = 0;
            UNIQUE.insert(a);                   //add to UNIQUE words
            a.clear();                         // clear and reset the string
        }
        if (s[i] == '\n') {
            linecount++;
        }
    }
    for(set<string>::iterator i = UNIQUE.begin(); i!= UNIQUE.end(); i++) {  
    cout << *i;
        }

    cout << '\n';
    cout << "line is " << linecount << '\n';
    return count;
}

int main()
{
    char c;
    string s; 
    while(fread(&c,1,1,stdin)) {
        s+=c;   //read element add to string
    }

    cout << "Words = " << sfind(s) << '\n';
    cout << "size is " << s.length() << '\n';
    cout << "Unique is "<< UNIQUE.size() << '\n';  
    return 0;
}

我也会用

fread(&c,1,1,stdin)

因为我稍后会用到更大的 wordcount 函数。

与其编写代码尝试解析空格中的字符串,不如使用 std::istringstream 进行解析。

这是一个例子:

#include <string>
#include <iostream>
#include <sstream>
#include <set>

int main()
{
    std::set<std::string> stringSet;
    std::string line;
    while (std::getline(std::cin, line))
    {
        std::istringstream oneline(line);
        std::string word;
        while (oneline >> word)
        {
           std::cout << word << "\n";
           stringSet.insert(word);
        }
    }

    std::cout << "\n\nThere are " << stringSet.size() << " unique words";
}

Live Example