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";
}
我正在编写一个 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";
}