• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 913
  • Last Modified:

How to create substrings from a sentence string C++

Ok this is what I am trying to do, in C++ language, I can create a string, what I want to go is take a sentence say "Here is a sentence that I want the program to use." How do I get the program to break each word into a substring so I can count the vowels in a loop, and then know to stop the loop when it gets to the .?
0
putyoursoxon
Asked:
putyoursoxon
  • 5
  • 5
1 Solution
 
itsmeandnobodyelseCommented:
You could use STL for example

#include <string>
using namespace std;

    ....

    string s = "Here is a sentence that I want the program to use.";
    s += ' ';   // add a space for easier parsing
    int pos1 = 0;
    int pos2 = 0;
    while ((pos2 = s.find_first_of(" ,.;/|", pos1)) != string::npos)
    {
         if (pos2 > pos1)
         {
              string sub = s.substr(pos1+1, pos2-pos1+1);
              // here you could store the found token to a vector, e.g by v.push_back(sub);
              if (s[pos2] == '.')   // ok we found the .
              {
               }
         }
    }
0
 
itsmeandnobodyelseCommented:
I forgot to add

    pos1 = pos2 +1;

at end of loop.
0
 
putyoursoxonAuthor Commented:
I tried this, but this will not work correctly it includes the space and the first letter of the next word in the current word
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
itsmeandnobodyelseCommented:
>>>> it includes the space and the first letter of the next word in the current word

Sorry, it should be

   pos2-pos1-1
0
 
putyoursoxonAuthor Commented:
Ok, let me write this into what I have so far and see how it goes, thanks
0
 
putyoursoxonAuthor Commented:
this also doesnt work does the same thing except it does it with the first word in a infinite loop
0
 
itsmeandnobodyelseCommented:
Take that
#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
 
int tokenize(const string & sin, vector<string> & tokens, vector<char> & separators)
{
    string s = sin;
    s += char(0);    // add a 0 char for getting end-of-string parsing
    string seps = " ,.;/|";
    seps += char(0);    
    int pos1 = 0;
    int pos2 = 0;
    while ((pos2 = s.find_first_of(seps, pos1)) != string::npos) 
    {
         if (pos2 > pos1)
         {
              string sub = s.substr(pos1, pos2-pos1);
              tokens.push_back(sub);
              separators.push_back(s[pos2]);
        }
        pos1 = pos2+1;   // don't forget that or you'll get an infinite loop
    }
    return tokens.size();
}
 
int main()
{
       int i; 
       string s = "Here is a sentence that I want the program to use.";
       vector<string> substrings;
       vector<char>   separators;
 
       int n = tokenize(s, substrings, separators);
       for (i = 0; i < n; ++i)
       {
            char c = separators[i];
            cout << setw(3) << right << i+1 << " " << left << setw(20) <<  substrings[i] 
                 << " separated by " << int(separators[i]) << " " << separators[i] << endl;
       }
       cin >> i;
       return 0;
}

Open in new window

0
 
putyoursoxonAuthor Commented:
im going to try a streamstring instead
0
 
itsmeandnobodyelseCommented:
>>>> im going to try a streamstring instead
The problem with streaming is that you could go for one delimiter only. In your case it is a space. But then, the fulstop at end must be parsed separately.
0
 
putyoursoxonAuthor Commented:
With streamstring can I use a terminating character like . To count as the end of a sentence?
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

  • 5
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now