Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   std::string, subscripting, and npos (http://www.velocityreviews.com/forums/t451370-std-string-subscripting-and-npos.html)

Marcus Kwok 01-27-2006 09:06 PM

std::string, subscripting, and npos
 
std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
"all characters" marker. I tried to use it this way, but my program
crashes:

#include <iostream>
#include <string>

int main()
{
std::string s = "hi/hello/now";
std::cout << s << '\n';

for (std::string::size_type i = 0; i != std::string::npos; ++i) {
if (s[i] == '/') {
s[i] = '\\';
}
}

std::cout << s << '\n';
}


If I change "std::string::npos" to "s.length()" then of course the
program works correctly. Why doesn't std::string::npos work in this
context?


--
Marcus Kwok

Bob Hairgrove 01-27-2006 09:16 PM

Re: std::string, subscripting, and npos
 
On Fri, 27 Jan 2006 21:06:31 +0000 (UTC), ricecake@gehennom.net
(Marcus Kwok) wrote:

>std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
>"all characters" marker. I tried to use it this way, but my program
>crashes:
>
>#include <iostream>
>#include <string>
>
>int main()
>{
> std::string s = "hi/hello/now";
> std::cout << s << '\n';
>
> for (std::string::size_type i = 0; i != std::string::npos; ++i) {
> if (s[i] == '/') {
> s[i] = '\\';
> }
> }
>
> std::cout << s << '\n';
>}
>
>
>If I change "std::string::npos" to "s.length()" then of course the
>program works correctly. Why doesn't std::string::npos work in this
>context?


std::string::npos is usually just an alias for ((unsigned)(-1)). You
are therefore incrementing i way past the end of the string's length.

std::string::npos is returned by most string functions which involve
some kind of find, and which would normally return the index or
position of the element being sought. Since there can never be such a
position, this value was chosen to indicate "not found" or not
present.

--
Bob Hairgrove
NoSpamPlease@Home.com

Victor Bazarov 01-27-2006 09:23 PM

Re: std::string, subscripting, and npos
 
Marcus Kwok wrote:
> std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
> "all characters" marker. I tried to use it this way, but my program
> crashes:
>
> #include <iostream>
> #include <string>
>
> int main()
> {
> std::string s = "hi/hello/now";
> std::cout << s << '\n';
>
> for (std::string::size_type i = 0; i != std::string::npos; ++i) {
> if (s[i] == '/') {
> s[i] = '\\';
> }
> }
>
> std::cout << s << '\n';
> }
>
>
> If I change "std::string::npos" to "s.length()" then of course the
> program works correctly. Why doesn't std::string::npos work in this
> context?


'npos' is a constant usually defined as (size_type)(-1). Its specific
purpose is to indicate "not found" condition when returning from 'find'
members and the "end" position when using 'substr'.

You mistakenly used it as if it is different for every 'string' object.
It's not. IIRC it's a static member.

V

Mike Wahler 01-27-2006 09:26 PM

Re: std::string, subscripting, and npos
 

"Marcus Kwok" <ricecake@gehennom.net> wrote in message
news:dre20n$9e3$1@news-int2.gatech.edu...
> std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
> "all characters" marker.


Its meaning depends upon context. It's most often used to
indicate 'not found' with e.g. 'find()'.

> I tried to use it this way, but my program
> crashes:
>
> #include <iostream>
> #include <string>
>
> int main()
> {
> std::string s = "hi/hello/now";
> std::cout << s << '\n';
>
> for (std::string::size_type i = 0; i != std::string::npos; ++i) {


'npos' is not a valid index for a string. Even if you use the
meaning 'all characters', what would that value as an index
mean? The book doesn't say 'how many characters' does it? :-)
(and even if it did, then the highest valid index would be
'how many, less one' (because first index is 0).)

The valid index values are those integers in the set beginning with
zero and ending with 'string::size() - 1', inclusive.

'size() - 1' can never be equal to 'npos'. That's part of
'npos's definition. The value of 'npos' must be chosen by
an implementation to be some value that is *not* a valid
index. That's how e.g. 'find()' (which returns an index
value), can distinguish between a found element and 'not found'.

Once 'i's value passes 'size() - 1', using it as an index
will give undefined behavior. (The 'at()' member functinon
would throw an exception).

Write this instead:

for (std::string::size_type i = 0; i != s.size(); ++i) {

> if (s[i] == '/') {
> s[i] = '\\';
> }
> }
>
> std::cout << s << '\n';
> }
>
>
> If I change "std::string::npos" to "s.length()"


Note that 'size()' and 'length()' are two functions which
have exactly the same effect.

> then of course the
> program works correctly. Why doesn't std::string::npos work in this
> context?


Because you're trying to use it for something other than
it's defined purpose. Like trying to cut a watermelon with
a feather. :-)

-Mike



Mike Wahler 01-27-2006 09:30 PM

Re: std::string, subscripting, and npos
 

"Victor Bazarov" <v.Abazarov@comAcast.net> wrote in message
news:ebwCf.394$a97.181@newsread1.mlpsca01.us.to.ve rio.net...
>> If I change "std::string::npos" to "s.length()" then of course the
>> program works correctly. Why doesn't std::string::npos work in this
>> context?

>
> 'npos' is a constant usually defined as (size_type)(-1). Its specific
> purpose is to indicate "not found" condition when returning from 'find'
> members and the "end" position when using 'substr'.
>
> You mistakenly used it as if it is different for every 'string' object.
> It's not. IIRC it's a static member.


I suspect that Marcus misunderstood after seeing npos used in
a different context, e.g. 'string::substr()'s second parameter
specifies a default value of 'npos', meaning 'all'.

std::string s("hello");
std::string sub(s.substr(0)); // now s == sub

-Mike



Marcus Kwok 01-27-2006 09:30 PM

Re: std::string, subscripting, and npos
 
Bob Hairgrove <invalid@bigfoot.com> wrote:
> On Fri, 27 Jan 2006 21:06:31 +0000 (UTC), ricecake@gehennom.net
> (Marcus Kwok) wrote:
>
>>std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
>>"all characters" marker. I tried to use it this way, but my program
>>crashes:
>>
>>#include <iostream>
>>#include <string>
>>
>>int main()
>>{
>> std::string s = "hi/hello/now";
>> std::cout << s << '\n';
>>
>> for (std::string::size_type i = 0; i != std::string::npos; ++i) {
>> if (s[i] == '/') {
>> s[i] = '\\';
>> }
>> }
>>
>> std::cout << s << '\n';
>>}
>>
>>
>>If I change "std::string::npos" to "s.length()" then of course the
>>program works correctly. Why doesn't std::string::npos work in this
>>context?

>
> std::string::npos is usually just an alias for ((unsigned)(-1)). You
> are therefore incrementing i way past the end of the string's length.
>
> std::string::npos is returned by most string functions which involve
> some kind of find, and which would normally return the index or
> position of the element being sought. Since there can never be such a
> position, this value was chosen to indicate "not found" or not
> present.


Thanks. I was thinking maybe it would be similar to the .end()
iterator (as in, 1 greater than the last element).

--
Marcus Kwok

David Harmon 01-27-2006 09:38 PM

Re: std::string, subscripting, and npos
 
On Fri, 27 Jan 2006 21:06:31 +0000 (UTC) in comp.lang.c++,
ricecake@gehennom.net (Marcus Kwok) wrote,
>std::string::npos is described in _TC++PL:SE_ (Section 20.3.4) as the
>"all characters" marker.


That statement refers specifically to the use of npos as an argument
to the string constructor that creates a substring of an existing
string. Your code is not doing anything even slightly resembling
that. Give me a break.


Duane Hebert 01-27-2006 09:51 PM

Re: std::string, subscripting, and npos
 
> Thanks. I was thinking maybe it would be similar to the .end()
> iterator (as in, 1 greater than the last element).


You could always just use an iterator.


All times are GMT. The time now is 12:07 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.