Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 833
  • Last Modified:

problem while separating words from sentence

Hello, to extract words from sentence i use this code.

#include <iostream.h>
#include <string.h>

using namespace std;

int main ()
{
   int i,k;
    string s, word;  
    cout << "Enter Sentence:\n";
    getline(cin, s);
    cout << "You entered:" << s << "\n";
     s += ',';  
    int npos = 0;
    int lpos = 0;
   
   
    while ((npos = (int)s.find_first_of(",", lpos)) != string::npos )
    {
         
          word = s.substr(lpos, npos - lpos);
                    cout << word << endl;
           lpos = npos + 1;
    }
 
    system("PAUSE");
      return 0;

    }


Input must be made like this (sentence): dog,cat,food,table,carrot,expert,exchange.
After last word dot.
And output should be like:
dog
cat
food
table
carrot
expert
exchange
-----------------------
But right now, i get:
dog
cat
foor
table
carrot
expert
exchange.

How to make, that there would be no dot "." after last word? (please write sample)

Also one more question, let say later i will need to check if word  has more than 5 letters, how could i do that? i know i can't do just "if (word>5)", because word is declared as string. Please help me, thanks!
0
moonskyland
Asked:
moonskyland
  • 8
  • 3
  • 3
  • +2
2 Solutions
 
UrosVidojevicCommented:
Add this, before printing the word.

              if (word[word.length()-1] == '.')
                    word = word.substr(0, word.length()-1);
0
 
UrosVidojevicCommented:
Or even better if you are sure that '.' is the last character of the sentence.
Eliminate it at the beginning, immediately after you read the sentence by:

s = s.substr(0, s.length()-1);
0
 
evilrixSenior Software Engineer (Avast)Commented:
You split up a string using a comma. So your code is doing exactly the right thing, the fact that there is a . at the end of the last word is a red herring, it'll happen on any word. In fact any char that is not a comma will be selected as a word. As UrosVidojevic has eluded, you need to perform some post processing of the string to 'clean it up'.

If you really need the power of parsing consider investing time in implemented one of the following free regex engines.

boost regex
http://www.boost.org/libs/regex/doc/index.html

PCRE
http://www.pcre.org/

Greta
http://research.microsoft.com/projects/greta/

Regexes are pretty easy to learn -- and fun to :)
http://www.regular-expressions.info/

I hope this helps.

-Rx.
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
evilrixSenior Software Engineer (Avast)Commented:
>> Also one more question, let say later i will need to check if word  has more than 5 letters, how could i do that

if(word.size() > 5)
{
    // more than 5 chars
}
0
 
evilrixSenior Software Engineer (Avast)Commented:
This goes some way towards fixing your problem...

#include <iostream>
#include <string>

int main ()
{
      std::string s;
      std::string word;  

      cout << "Enter Sentence:\n";
      getline(cin, s);
      cout << "You entered:" << s << "\n";

      s += ',';  
      
      std::string::size_type npos = 0;
      std::string::size_type lpos = 0;

      while ((npos = s.find_first_of(",", lpos)) != std::string::npos )
      {
            word = s.substr(lpos, npos - lpos);
            
            std::string::iterator itr = word.begin();

            while(itr != word.end())
            {
                  char c = *itr;

                  if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
                  {
                        ++itr;
                  }
                  else
                  {
                        itr = word.erase(itr);
                  }
            }

            std::cout << word << std::endl;
            lpos = npos + 1;
      }

      system("PAUSE");
      return 0;
}

NB. Code I post is for example only and is not guaranteed to be defect free!
0
 
moonskylandAuthor Commented:
Thanks for help! :) i`m still learning c++.
0
 
evilrixSenior Software Engineer (Avast)Commented:
You are very welcome :)
0
 
crazybrkerCommented:
To your first question, you are currently taking anything from the start of s (your sentence) up till the first comma then cout that, the issue is that it considers the "." (period) as part of your new word. So try addind that to your find_first_of function i.e.
    while ((npos = (int)s.find_first_of(",.", lpos)) != string::npos )
now it will split the sentence on every occurance of a period or comma.

as for your 2nd question the function that you are looking for would be .length i.e.

cout << "The length of word is " << word.length() << " characters.\n";
or
if (word.length()<5)
do whatever...
0
 
moonskylandAuthor Commented:
crazybrker, thank you also for help. checked it works too, i thought it is not possible to write ",." (two elements), i mean, i thought it would work only if word1,.word2,.word3,.and so on.
Thanks for help again! :-)
0
 
evilrixSenior Software Engineer (Avast)Commented:
Of course, the next problem you'll hit is other non-alpha characters will also form part of your word-set so you'll have to list them all in the find_first_of but then they'll be word separators when all you probably want to do is just filter them out. This is why I provided you with a code snippet that shows how to filter these out rather than split on them.
0
 
Infinity08Commented:
btw, these headers :

#include <iostream.h>
#include <string.h>

are deprecated. Use these instead :

#include <iostream>
#include <string>
0
 
evilrixSenior Software Engineer (Avast)Commented:
As per my example code :)
0
 
Infinity08Commented:
I know ... Just wanted to say it explicitly.
0
 
evilrixSenior Software Engineer (Avast)Commented:
You just wanted the final word :-p
0
 
Infinity08Commented:
Mmmm ... did I ? ;)
0
 
moonskylandAuthor Commented:
final word is mine :D thanks to all for help
0
 
evilrixSenior Software Engineer (Avast)Commented:
You are very welcome --- doh! :-s
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 8
  • 3
  • 3
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now