473,383 Members | 1,885 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,383 software developers and data experts.

"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

Jul 18 '07 #1
13 3618
On Wed, 18 Jul 2007 14:07:59 +0500, arnuld wrote:
/* 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

Jul 18 '07 #2
On Wed, 18 Jul 2007 14:07:59 +0500, arnuld wrote:
/* 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]);
}

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

return 0;
}
--
Obnoxious User
Jul 18 '07 #3
arnuld wrote:
/* 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;
}
Jul 18 '07 #4
arnuld wrote:
/* 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.
Jul 18 '07 #5
On Wed, 18 Jul 2007 09:26:44 +0000, Obnoxious User wrote:

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

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

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

Jul 18 '07 #6
On Wed, 18 Jul 2007 12:04:02 +0200, anon wrote:
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;

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

Jul 18 '07 #7
arnuld wrote:
[..]
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
Jul 18 '07 #8
Victor Bazarov wrote:
arnuld wrote:
>[..]
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
Jul 18 '07 #9
On 2007-07-18 18:17, anon wrote:
Victor Bazarov wrote:
>arnuld wrote:
>>[..]
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
Jul 18 '07 #10
arnuld wrote:
/* 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()?

Jul 18 '07 #11

arnuld <ge*********@gmail.comwrote in message...
/* 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
Jul 18 '07 #12
On Jul 18, 12:53 pm, Ian Collins <ian-n...@hotmail.comwrote:
arnuld wrote:
/* 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;
}
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:ja*********@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

Jul 19 '07 #13
In article <5g**************@mid.individual.net>, ia******@hotmail.com
says...

[ ... ]
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.
Jul 23 '07 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
by: Mullin Yu | last post by:
hi, i have a web service that has file operations on Windows OS, and there may be a file concurrency issue if only one working directory e.g. c:\working therefore, i want to have a unique sub...
5
by: Martin Heuckeroth | last post by:
Hi We are working on a webservice application and are having some problems with the cookies and/or sessions. We have them working on our intranet but then its not working on the internet. We...
5
by: tshad | last post by:
I have been working with setting my drop boxes to allow double clicking to select an item. It worked fine until I made some changes. I then stripped the page down to the bare essentials to find...
8
by: jojobar | last post by:
Okay, I am trying to do is to test the webresource in 2.0 1. I created a new project with assembly name (and default assembly name) "Office". 2. I added the following to the AssemblyInfo.cs...
2
by: Don | last post by:
I'm having problems with intellisense, autocomplete, etc. suddenly not working in certain classes of a project I'm working on. All the options are set, and it all works fine for most classes, but...
9
by: MSDNAndi | last post by:
Hi, I have a set of simple webservices calls that worked fine using .NET Framework 1.0. I am calling a Java/Apache based webservices, the calling side is not able to supply a proper WSDL. ...
4
by: qbproger | last post by:
I'm developing a plugin for some software. The previous version of the software didn't require a start in directory to be set. This allowed me to leave the working directory to the default in the...
3
by: Jason Huang | last post by:
Hi, In our C# Windows Form application, we are using the SQL Server 2000 as the database server. The Database table MyTable has a field RegistrationDate which represents the Date a client comes...
0
by: WORKING IN FAITH | last post by:
three years I LOVE You Monica More options 1 message - Collapse all WORKING IN FAITH View profile More options Nov 13, 11:29 am three years I LOVE You Monica
3
by: lds | last post by:
On our server we have both applications that have been migrated to use v2.0 of the framework as well as apps that have not yet been migrated and still use 1.1. When I tried to deploy my v2.0 app...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.