Connecting Tech Pros Worldwide Help | Site Map

"ispunct()" not working on std::string

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 18th, 2007, 09:05 AM
arnuld
Guest
 
Posts: n/a
Default "ispunct()" not working on std::string

/* C++ Primer 4/e
* section 3.2 - String Standard Library

* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */

#include <iostream>
#include <string>

int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;

for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}

std::cout << stripped_word << std::endl;

return 0;
}

--
-- http://arnuld.blogspot.com


  #2  
Old July 18th, 2007, 09:15 AM
arnuld
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On Wed, 18 Jul 2007 14:07:59 +0500, arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
>
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
>
std::cout << stripped_word << std::endl;
>
return 0;
}

SORRY, i forgot to post the output:

[arnuld@arch cpp ]% g++ -ansi -pedantic -Wall -Wextra ex_03-10.cpp
[arnuld@arch cpp ]% ./a.out
Enter a string: comp.lang.c++

[arnuld@arch cpp ]%


you see, it does not prinit anything at all but it compiled successfully.
where is the bug ?


--
-- http://arnuld.blogspot.com

  #3  
Old July 18th, 2007, 09:45 AM
Obnoxious User
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On Wed, 18 Jul 2007 14:07:59 +0500, arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
>
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
A std::string is not an open array, you can't just assign
to random non-existing positions.

stripped_word += a_word[ix];
or
stripped_word.append(a_word[ix]);
Quote:
}
>
std::cout << stripped_word << std::endl;
>
return 0;
}
>
--
Obnoxious User
  #4  
Old July 18th, 2007, 10:05 AM
anon
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
>
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
>
std::cout << stripped_word << std::endl;
>
return 0;
}
>
Here is the fixed (hack) version:


#include <iostream>
#include <string>

int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;

for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word.at(ix)) == 0)
stripped_word.append(1,a_word.at(ix));
}

std::cout << stripped_word << std::endl;

return 0;
}
  #5  
Old July 18th, 2007, 10:55 AM
Ian Collins
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
>
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
>
std::cout << stripped_word << std::endl;
>
return 0;
}
>
As well as the other suggestions, you could use:

for( std::string::const_iterator ix = a_word.begin();
ix != a_word.end(); ++ix )
{
if(ispunct(*ix) == 0)
stripped_word += *ix;
}


--
Ian Collins.
  #6  
Old July 18th, 2007, 12:25 PM
arnuld
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On Wed, 18 Jul 2007 09:26:44 +0000, Obnoxious User wrote:

Quote:
A std::string is not an open array, you can't just assign to random
non-existing positions.
ok, got it

Quote:
stripped_word += a_word[ix];
this works. we are just concatenating 2 string objects. right ?

Quote:
stripped_word.append(a_word[ix]);
[arnuld@arch cpp ]% g++ -ansi -pedantic -Wall -Wextra ex_03-10.cpp
ex_03-10.cpp: In function ‘int main()’: ex_03-10.cpp:21: error: no
matching function for call to ‘std::basic_string<char,
std::char_traits<char>, std::allocator<char::append(char&)’
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../../include/c++/4.2.1/bits/basic_string.tcc:330:
note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>&
std::basic_string<_CharT, _Traits, _Alloc>::append(const
std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits
= std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../../include/c++/4.2.1/bits/basic_string.tcc:347:
note: std::basic_string<_CharT, _Traits, _Alloc>&
std::basic_string<_CharT, _Traits, _Alloc>::append(const
std::basic_string<_CharT, _Traits, _Alloc>&, typename
_Alloc::rebind<_CharT>::other::size_type, typename
_Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits =
std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../../include/c++/4.2.1/bits/basic_string.tcc:303:
note: std::basic_string<_CharT, _Traits, _Alloc>&
std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*, typename
_Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits =
std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../../include/c++/4.2.1/bits/basic_string.h:824:
note: std::basic_string<_CharT, _Traits, _Alloc>&
std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with
_CharT = char, _Traits = std::char_traits<char>, _Alloc =
std::allocator<char>] <near match>
/usr/lib/gcc/i686-pc-linux-gnu/4.2.1/../../../../include/c++/4.2.1/bits/basic_string.tcc:286:
note: std::basic_string<_CharT, _Traits, _Alloc>&
std::basic_string<_CharT, _Traits, _Alloc>::append(typename
_Alloc::rebind<_CharT>::other::size_type, _CharT) [with _CharT = char,
_Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
[arnuld@arch cpp ]%
[arnuld@arch cpp ]% g++ --version
g++ (GCC) 4.2.1 20070704 (prerelease) Copyright (C) 2007 Free Software
Foundation, Inc. This is free software; see the source for copying
conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

[arnuld@arch cpp ]%


--
-- http://arnuld.blogspot.com

  #7  
Old July 18th, 2007, 12:35 PM
arnuld
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On Wed, 18 Jul 2007 12:04:02 +0200, anon wrote:
Quote:
Here is the fixed (hack) version:
:-)
Quote:
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word.at(ix)) == 0)
stripped_word.append(1,a_word.at(ix));
}
>
std::cout << stripped_word << std::endl;
>
return 0;

can you tell me how this works or just point me to someplave which
explains that:

stripped_word.append(1,a_word.at(ix));

i mean, what is "1" doing here ? and why (ix) rather than [ix] ? i am at
halfway of chapter 3 so i have not come across this "append" member
function. just covered "size" and "empty" till yet.




--
-- http://arnuld.blogspot.com

  #8  
Old July 18th, 2007, 12:35 PM
Victor Bazarov
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

arnuld wrote:
Quote:
[..]
can you tell me how this works or just point me to someplave which
explains that:
>
stripped_word.append(1,a_word.at(ix));
>
i mean, what is "1" doing here ? and why (ix) rather than [ix] ? i am
at halfway of chapter 3 so i have not come across this "append" member
function. just covered "size" and "empty" till yet.
RTFM. 'append' is overloaded and one of them takes a number (N) and
the character and appends a string generated from N characters. There
is a constructor that does similar stuff, BTW.

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


  #9  
Old July 18th, 2007, 04:25 PM
anon
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

Victor Bazarov wrote:
Quote:
arnuld wrote:
Quote:
>[..]
>can you tell me how this works or just point me to someplave which
>explains that:
>>
> stripped_word.append(1,a_word.at(ix));
>>
>i mean, what is "1" doing here ? and why (ix) rather than [ix] ? i am
>at halfway of chapter 3 so i have not come across this "append" member
>function. just covered "size" and "empty" till yet.
>
RTFM. 'append' is overloaded and one of them takes a number (N) and
the character and appends a string generated from N characters. There
is a constructor that does similar stuff, BTW.
These guys got very good references:
http://www.cppreference.com/cppstring/index.html
and should answer all questions.


PS If anyone know better references, please let me know.
www.cppreference.com is missing lots of stuff
  #10  
Old July 18th, 2007, 04:35 PM
=?ISO-8859-1?Q?Erik_Wikstr=F6m?=
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On 2007-07-18 18:17, anon wrote:
Quote:
Victor Bazarov wrote:
Quote:
>arnuld wrote:
Quote:
>>[..]
>>can you tell me how this works or just point me to someplave which
>>explains that:
>>>
>> stripped_word.append(1,a_word.at(ix));
>>>
>>i mean, what is "1" doing here ? and why (ix) rather than [ix] ? i am
>>at halfway of chapter 3 so i have not come across this "append" member
>>function. just covered "size" and "empty" till yet.
>>
>RTFM. 'append' is overloaded and one of them takes a number (N) and
>the character and appends a string generated from N characters. There
>is a constructor that does similar stuff, BTW.
>
These guys got very good references:
http://www.cppreference.com/cppstring/index.html
and should answer all questions.
>
>
PS If anyone know better references, please let me know.
www.cppreference.com is missing lots of stuff
www.cplusplus.com is quite complete I think, but I like the simplicity
of www.cppreference.com better.

--
Erik Wikström
  #11  
Old July 18th, 2007, 05:45 PM
red floyd
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
>
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
>
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
>
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
>
std::cout << stripped_word << std::endl;
>
return 0;
}
>

Don't you also need to #include <cctypefor ispunct()?

  #12  
Old July 18th, 2007, 09:45 PM
BobR
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string


arnuld <geek.arnuld@gmail.comwrote in message...
Quote:
/* C++ Primer 4/e * section 3.2 - String Standard Library
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
>
#include <iostream>
#include <string>
int main(){
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix){
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
std::cout << stripped_word << std::endl;
return 0;
}
>
Another way than shown already (push_back()):

#include <iostream>
#include <string>
#include <cctype>

int main(){
std::string a_word("I think, therefore, I am! I'm shocked?");
// std::cout << "Enter a string: ";
// std::cin >a_word;
std::cout<<"a_word="<<a_word<<std::endl;

std::string stripped_word;
for( std::string::size_type ix = 0; ix != a_word.size(); ++ix){
if( not std::ispunct( a_word.at( ix ) ) )
stripped_word.push_back( a_word.at( ix ) );
}

std::cout<<"stripped_word="<<stripped_word<<std::e ndl;
return 0;
}
// out:a_word=I think, therefore, I am! I'm shocked?
// out:stripped_word=I think therefore I am Im shocked

--
Bob R
POVrookie


  #13  
Old July 19th, 2007, 03:05 PM
James Kanze
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

On Jul 18, 12:53 pm, Ian Collins <ian-n...@hotmail.comwrote:
Quote:
arnuld wrote:
Quote:
/* C++ Primer 4/e
* section 3.2 - String Standard Library
Quote:
Quote:
* exercise 3.10
* STATEMENT
* write a programme to strip the punctation from the string. */
Quote:
Quote:
#include <iostream>
#include <string>
Quote:
Quote:
int main()
{
std::cout << "Enter a string: ";
std::string a_word, stripped_word;
std::cin >a_word;
Quote:
Quote:
for(std::string::size_type ix = 0; ix != a_word.size(); ++ix)
{
if(ispunct(a_word[ix]) == 0)
stripped_word[ix] = a_word[ix];
}
Quote:
Quote:
std::cout << stripped_word << std::endl;
return 0;
}
Quote:
As well as the other suggestions, you could use:
Quote:
for( std::string::const_iterator ix = a_word.begin();
ix != a_word.end(); ++ix )
{
if(ispunct(*ix) == 0)
stripped_word += *ix;
}
That's getting close to what I would write. Except that the one
argument form of ispunct requires an include of <ctype.h>, and
it's undefined behavior to use it directly on a char. For a
quick program, without using any of my existing toolset, I'd
write:

if ( ! ispunct( static_cast< unsigned char >( *ix ) ) {
stripped_word += *ix ;
}

in the loop. With my usual tools, I'd more likely write:

word.erase( std::remove( word.begin(), word.end(),
CTypeIs( std::ctype_base::punct )),
word.end() ) ;

and be done with it. But this only works because I've got the
function objects to wrap std::ctype<charin my standard
toolbox. Otherwise, you have to write a special class to do
this, which is a bit of a drag.

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

  #14  
Old July 23rd, 2007, 04:45 AM
Jerry Coffin
Guest
 
Posts: n/a
Default Re: "ispunct()" not working on std::string

In article <5g69pdF3e3g6kU11@mid.individual.net>, ian-news@hotmail.com
says...

[ ... ]
Quote:
As well as the other suggestions, you could use:
>
for( std::string::const_iterator ix = a_word.begin();
ix != a_word.end(); ++ix )
{
if(ispunct(*ix) == 0)
stripped_word += *ix;
}
Or:

std::remove_copy_if(a_word.begin(), a_word.end(),
std::back_inserter(stripped_word), ispunct);

Of course, to be correct you really can't apply ispunct directly to
chars. Something like this should fix that:

struct punct {
bool operator()(char ch) {
return ispunct((unsigned char)ch);
}
};

then the same algorithm, but using that functor:

std::remove_copy_if(a_word.begin(), a_word.end(),
std::back_inserter(stripped_word), punct());

--
Later,
Jerry.

The universe is a figment of its own imagination.
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

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 Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.