Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > converting a string to an array of words

Reply
Thread Tools

converting a string to an array of words

 
 
Frederik Van Bogaert
Guest
Posts: n/a
 
      04-19-2007
Hi! I've taken my first steps into the world of c++ by trying to write a
text adventure game. Things are proceeding fine, but there's some code
in there that isn't very well coded. More specifically, I use the
following code:

...
string word [4];
size_t pos = action.find(" ");
word[0] = action.substr (0,pos);
if (pos < action.size() - 2)
{
word[1] = action.substr(pos + 1);
}
string word1 [2];

for (int i=1;i<3;i++)
{
pos = word[i].find(" ");
if (pos == string::npos) goto skippy;
word1[i-1] = word[i].substr (0,pos);
if (pos < word[i].size() - 2)
{
word[i+1] = word[i].substr(pos + 1);
}
word[i] = word1[i-1];
}

skippy:
...

To convert a string called 'action' into the array word[4]. Is there a
way to do this more efficiently?
Thanks
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      04-19-2007
Frederik Van Bogaert wrote:
> [..]
>
> To convert a string called 'action' into the array word[4]. Is there a
> way to do this more efficiently?


Not sure about efficiency. But elegance is relatively easy to come by.
All you need to do is take your string, construct a stringstream out of
it and then read all the words from it until end-of-file.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
 
 
 
Jim Langston
Guest
Posts: n/a
 
      04-19-2007
"Frederik Van Bogaert" <> wrote in
message news:f084mn$lbd$...
> Hi! I've taken my first steps into the world of c++ by trying to write a
> text adventure game. Things are proceeding fine, but there's some code in
> there that isn't very well coded. More specifically, I use the following
> code:
>
> ...
> string word [4];
> size_t pos = action.find(" ");
> word[0] = action.substr (0,pos);
> if (pos < action.size() - 2)
> {
> word[1] = action.substr(pos + 1);
> }
> string word1 [2];
>
> for (int i=1;i<3;i++)
> {
> pos = word[i].find(" ");
> if (pos == string::npos) goto skippy;
> word1[i-1] = word[i].substr (0,pos);
> if (pos < word[i].size() - 2)
> {
> word[i+1] = word[i].substr(pos + 1);
> }
> word[i] = word1[i-1];
> }
>
> skippy:
> ...
>
> To convert a string called 'action' into the array word[4]. Is there a way
> to do this more efficiently?
> Thanks


Use. std::stringstream. stringstream will read using >> like std::cin,
stopping on spaces.

Output of following program is:

look
at
the
clock
on
the
wall

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

// typedef is not required, just makes it a little eaiser.
typedef std::vector<std::string> WordVec;

int main()
{
std::string action = "look at the clock on the wall";

WordVec Words;
// Following declares a stringstream Parse and initializes it to the
contents of action
std::stringstream Parse( action );

// Now we read each word out one by one til there's no more and stuff
them into our vector
std::string word;
while ( Parse >> word )
Words.push_back( word );

// At this point each word is in the vector.

for ( WordVec::iterator it = Words.begin(); it != Words.end(); ++it )
std::cout << (*it) << "\n";

std::string wait;
std::getline( std::cin, wait );
}


 
Reply With Quote
 
Frederik Van Bogaert
Guest
Posts: n/a
 
      04-19-2007
Jim Langston wrote:
> "Frederik Van Bogaert" <> wrote in
> message news:f084mn$lbd$...
>> Hi! I've taken my first steps into the world of c++ by trying to write a
>> text adventure game. Things are proceeding fine, but there's some code in
>> there that isn't very well coded. More specifically, I use the following
>> code:
>>
>> ...
>> string word [4];
>> size_t pos = action.find(" ");
>> word[0] = action.substr (0,pos);
>> if (pos < action.size() - 2)
>> {
>> word[1] = action.substr(pos + 1);
>> }
>> string word1 [2];
>>
>> for (int i=1;i<3;i++)
>> {
>> pos = word[i].find(" ");
>> if (pos == string::npos) goto skippy;
>> word1[i-1] = word[i].substr (0,pos);
>> if (pos < word[i].size() - 2)
>> {
>> word[i+1] = word[i].substr(pos + 1);
>> }
>> word[i] = word1[i-1];
>> }
>>
>> skippy:
>> ...
>>
>> To convert a string called 'action' into the array word[4]. Is there a way
>> to do this more efficiently?
>> Thanks

>
> Use. std::stringstream. stringstream will read using >> like std::cin,
> stopping on spaces.
>
> Output of following program is:
>
> look
> at
> the
> clock
> on
> the
> wall
>
> #include <iostream>
> #include <string>
> #include <vector>
> #include <sstream>
>
> // typedef is not required, just makes it a little eaiser.
> typedef std::vector<std::string> WordVec;
>
> int main()
> {
> std::string action = "look at the clock on the wall";
>
> WordVec Words;
> // Following declares a stringstream Parse and initializes it to the
> contents of action
> std::stringstream Parse( action );
>
> // Now we read each word out one by one til there's no more and stuff
> them into our vector
> std::string word;
> while ( Parse >> word )
> Words.push_back( word );
>
> // At this point each word is in the vector.
>
> for ( WordVec::iterator it = Words.begin(); it != Words.end(); ++it )
> std::cout << (*it) << "\n";
>
> std::string wait;
> std::getline( std::cin, wait );
> }
>
>

Thanks! That's exactly what I was looking for

PS: Is there some reason you're using "std::" all the time instead of
specifying "using namespace std;" in the beginning of the file as I've
been told to do?
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      04-19-2007
Jim Langston wrote:
> [..]
> // Now we read each word out one by one til there's no more and
> stuff them into our vector
> std::string word;
> while ( Parse >> word )
> Words.push_back( word );


Replace the three lines above with this:

std::copy(std::istream_iterator<std::string>(Parse ),
std::istream_iterator<std::string>(),
std::back_inserter(Words));

>
> // At this point each word is in the vector.
>
> for ( WordVec::iterator it = Words.begin(); it != Words.end();
> ++it ) std::cout << (*it) << "\n";


Replace the loop with this:

std::copy(Words.begin(), Words.end(),
std:stream_iterator<std::string>(std::cout, "\n"));

>
> std::string wait;
> std::getline( std::cin, wait );
> }


And you get an even more radical standard-library based program!

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
Jim Langston
Guest
Posts: n/a
 
      04-19-2007
"Frederik Van Bogaert" <> wrote in
message news:f0868e$m52$...
> Jim Langston wrote:
>> "Frederik Van Bogaert" <> wrote in
>> message news:f084mn$lbd$...
>>> Hi! I've taken my first steps into the world of c++ by trying to write a
>>> text adventure game. Things are proceeding fine, but there's some code
>>> in there that isn't very well coded. More specifically, I use the
>>> following code:
>>>
>>> ...
>>> string word [4];
>>> size_t pos = action.find(" ");
>>> word[0] = action.substr (0,pos);
>>> if (pos < action.size() - 2)
>>> {
>>> word[1] = action.substr(pos + 1);
>>> }
>>> string word1 [2];
>>>
>>> for (int i=1;i<3;i++)
>>> {
>>> pos = word[i].find(" ");
>>> if (pos == string::npos) goto skippy;
>>> word1[i-1] = word[i].substr (0,pos);
>>> if (pos < word[i].size() - 2)
>>> {
>>> word[i+1] = word[i].substr(pos + 1);
>>> }
>>> word[i] = word1[i-1];
>>> }
>>>
>>> skippy:
>>> ...
>>>
>>> To convert a string called 'action' into the array word[4]. Is there a
>>> way to do this more efficiently?
>>> Thanks

>>
>> Use. std::stringstream. stringstream will read using >> like std::cin,
>> stopping on spaces.
>>
>> Output of following program is:
>>
>> look
>> at
>> the
>> clock
>> on
>> the
>> wall
>>
>> #include <iostream>
>> #include <string>
>> #include <vector>
>> #include <sstream>
>>
>> // typedef is not required, just makes it a little eaiser.
>> typedef std::vector<std::string> WordVec;
>>
>> int main()
>> {
>> std::string action = "look at the clock on the wall";
>>
>> WordVec Words;
>> // Following declares a stringstream Parse and initializes it to the
>> contents of action
>> std::stringstream Parse( action );
>>
>> // Now we read each word out one by one til there's no more and stuff
>> them into our vector
>> std::string word;
>> while ( Parse >> word )
>> Words.push_back( word );
>>
>> // At this point each word is in the vector.
>>
>> for ( WordVec::iterator it = Words.begin(); it != Words.end(); ++it )
>> std::cout << (*it) << "\n";
>>
>> std::string wait;
>> std::getline( std::cin, wait );
>> }
>>
>>

> Thanks! That's exactly what I was looking for
>
> PS: Is there some reason you're using "std::" all the time instead of
> specifying "using namespace std;" in the beginning of the file as I've
> been told to do?


Because I feel that "using namespace std;" defeats the purpose of namespaces
to begin win. Check out the FAQ:

http://www.parashift.com/c++-faq-lit....html#faq-27.5


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Replace stop words (remove words from a string) BerlinBrown Python 6 01-17-2008 02:37 PM
split camelcase string into array of words words pantagruel Javascript 8 07-22-2006 07:46 PM
Words Words utab C++ 6 02-16-2006 07:00 PM
Non-noise words are incorrectly recognised as noise words. Peter Strĝiman ASP .Net 1 08-23-2005 01:26 PM
Re: A little bit of help regarding my linked list program required. - "words.c" - "words.c" Richard Heathfield C Programming 7 10-05-2003 02:38 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57