строка — количество слов в c ++ после использования (getline (cin, input))?

Так что я чрезвычайно новичок в этом. У меня есть задание для подсчета количества строк, слов, символов, уникальных строк и уникальных слов из пользовательского ввода. До сих пор я получил строки, уникальные строки и символы из моего кода. Я думал, что получил слова, но тогда это не работает, когда я учитываю двойные пробелы и табуляции. Также я понятия не имею, как найти уникальные слова. Пожалуйста, предложите вашу помощь.

Код:

 // 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;
}

0

Решение

вам нужно заключить +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;
}
0

Другие решения

Вот пример того, как может выглядеть функция

#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;
}

//...
0

По вопросам рекламы [email protected]