Так что я чрезвычайно новичок в этом. У меня есть задание для подсчета количества строк, слов, символов, уникальных строк и уникальных слов из пользовательского ввода. До сих пор я получил строки, уникальные строки и символы из моего кода. Я думал, что получил слова, но тогда это не работает, когда я учитываю двойные пробелы и табуляции. Также я понятия не имею, как найти уникальные слова. Пожалуйста, предложите вашу помощь.
Код:
// What I dont have:
//words
//Total words#include <iostream>
#include <string>
#include <set>
using namespace std;unsigned long countWords(const string& s, set<string>& wl); //total words
int main()
{
int linenum=0, charnum=0, totalwords=0;
set<string> lines;
string input;
set<string> unique; //to store unique words from countWords function
while (getline(cin,input))
{
lines.insert(input);
linenum++;
charnum+= input.length();totalwords += countWords(input,unique);
}
cout << linenum <<" "<< totalwords <<" "<< charnum <<" " << lines.size()<<" " << unique.size()<< endl;
system("PAUSE");
return 0;
}
unsigned long countWords(const string& s, set<string>& wl) //total words
{
int wcount=1;for (unsigned int i=0; i < s.length(); i++)
{
if ((s.at(i) == ' ')&&(s.at(i)+1 !='\0')) {
wcount++;
}
}return wcount;
}
вам нужно заключить +1 в скобки, ваша функция будет такой
unsigned long countWords(const string& s, set<string>& wl) //total words
{
int wcount=0;// initial value must be zero
int N = 0;// you need to add this to count the characters of each word.
for (unsigned int i=0; i < s.length(); i++)
{
if ((s.at(i) == ' ')||(s.at(i+1) =='\0')) {// Condition must be or instead of and
wl.insert(s.substr(i-N-1,N));
++wcount;
N = 0;
}else ++N;
}
return wcount;
}
Вот пример того, как может выглядеть функция
#include <iostream>
#include <sstream>
#include <set>
#include <string>
#include <iterator>
#include <algorithm>unsigned long countWords( std::set<string> &wl, const std::string &s )
{
std::istringstream is( s );
wl.insert( std::istream_iterator<std::string>( is ),
std::istream_iterator<std::string>() );
is.clear();
is.str( s );
return ( std::distance( std::istream_iterator<std::string>( is ),
std::istream_iterator<std::string>() ) );
}
//...
В этом примере рассуждения рассматриваются как части слов.
Если вы еще не знаете std :: istringstream и другие возможности C ++, вы можете написать функцию следующим образом
#include <iostream>
#include <set>
#include <string>unsigned long countWords( std::set<string> &wl, const std::string &s )
{
const char *white_space = " \t";
unsigned long count = 0;
for ( std::string::size_type pos = 0, n = 0;
( pos = s.find_first_not_of( white_space, pos ) ) != std::string::npos;
pos = n == std::string::npos ? s.size() : n )
{
++count;
n = s.find_first_of( white_space, pos );
wl.insert( s.substr( pos, ( n == std::string::npos ? std::string::npos : n - pos ) ) );
}
return count;
}
//...