string reading with sscanf



 DEVELOP > c-Plus-Plus > string reading with sscanf

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: "Bint"
Date: 14 Jan 2008 11:06:12 AM
Object: string reading with sscanf
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry" etc
i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no more. if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values of
the first u/name, right? is there any way to retrieve the string pointer
position from sscanf so that I can just call it again from that point in the
string?
thanks
B
.

User: "Daniel T."

Title: Re: string reading with sscanf 14 Jan 2008 03:39:54 PM
"Bint" <bint@csgs.com> wrote:

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry" etc

i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no more. if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values of
the first u/name, right? is there any way to retrieve the string pointer
position from sscanf so that I can just call it again from that point in the
string?

I would do something like this:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
using namespace std;
istream& find( istream& is, char c )
{
find( istream_iterator<char>( is ), istream_iterator<char>(), c );
return is;
}
int main()
{
const char* str =
"success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry";

stringstream ss( str );
find( ss, '=' );
int i = 0;
ss >> i;
cout << "success = " << i << '\n';
int u;
string name;
while ( find( ss, '=' ) && ss >> u &&
find( ss, '=' ) && getline( ss, name, '&' ) )
{
cout << "u = " << u << " name = " << name << '\n';
}
}
.
User: "aaragon"

Title: Re: string reading with sscanf 14 Jan 2008 03:59:37 PM
On Jan 14, 3:39 pm, "Daniel T." <danie...@earthlink.net> wrote:

"Bint" <b...@csgs.com> wrote:

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry" etc


i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no more. if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values of
the first u/name, right? is there any way to retrieve the string pointer
position from sscanf so that I can just call it again from that point in the
string?


I would do something like this:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

using namespace std;

istream& find( istream& is, char c )
{
find( istream_iterator<char>( is ), istream_iterator<char>(), c );
return is;

}

int main()
{
const char* str =
"success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry";

stringstream ss( str );
find( ss, '=' );
int i = 0;
ss >> i;
cout << "success = " << i << '\n';
int u;
string name;
while ( find( ss, '=' ) && ss >> u &&
find( ss, '=' ) && getline( ss, name, '&' ) )
{
cout << "u = " << u << " name = " << name << '\n';
}

}

I would use a tokenizer to do that. You can use the boost tokenizer
for that giving the token & or you can create your own by reading each
character and comparing it with '&' to separate the whole string in
tokens.
.


User: "Jerry Coffin"

Title: Re: string reading with sscanf 14 Jan 2008 11:55:54 PM
In article <13on5kmk10elr2e@corp.supernews.com>,
says...

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry" etc

i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no more. if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values of
the first u/name, right? is there any way to retrieve the string pointer
position from sscanf so that I can just call it again from that point in the
string?

You've gotten a couple of suggestions already, but I'll throw another
into the mix, just for fun:
// warning: only minimally tested. Makes no attempt at verifying or
// reacting reasonably to bad input.
#include <sstream>
#include <algorithm>
#include <map>
#include <iostream>
#include <string>
#include <stdlib.h>
// the real guts: read a single 'name=value' pair. Written as a template
// so the value can be an int, string, or anything else we can extract
// from a stream.
template<class T>
std::istream &getvalue(std::istream &is, T &value) {
// first read the whole 'name=value' pair
std::string temp;
std::getline(is, temp, '&');
// then find the value part:
int pos = temp.find('=');
std::string temp2(temp.substr(pos+1,-1));
// and read the value:
std::stringstream t(temp2);
t >> value;
return is;
}
typedef std::pair<int, std::string> uname;
// not technically allowed, but won't be found unless in std namespace:
namespace std {
std::istream &operator>>(std::istream &is, uname &un) {
getvalue(is, un.first);
getvalue(is, un.second);
return is;
}
std::ostream &operator<<(std::ostream &os, uname const &un) {
return os << un.first << ":\t" << un.second;
}
}
int main() {
std::stringstream input("success=1&u=0&name=bint"
"&u=1&name=lucy&u=2&name=barry");

std::map<int, std::string> values;
int success;
getvalue(input, success);
// read in the data
std::copy(std::istream_iterator<uname>(input),
std::istream_iterator<uname>(),
std::inserter(values, values.begin()));
// and display what we read:
std::copy(values.begin(), values.end(),
std::ostream_iterator<uname>(std::cout, "\n"));
return 0;
}
--
Later,
Jerry.
The universe is a figment of its own imagination.
.

User: "=?utf-8?Q?David_C=C3=B4me?="

Title: Re: string reading with sscanf 14 Jan 2008 11:41:40 AM
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.com> wrote:

i have a string "success=3D1&u=3D0&name=3Dbint&u=3D1&name=3Dlucy&u=3D2=

&name=3Dbarry" =

etc

i can use sscanf(string,"success=3D%d", &d) to get the success value. =

but

after that i just want to read name and u pairs until there are no =
more. if
Iwere to do a
sscanf (string,"success=3D%d&u=3D%d&name=3D%s"), that would get me the=

values =

of
the first u/name, right? is there any way to retrieve the string poin=

ter

position from sscanf so that I can just call it again from that point =

in =

the
string?

thanks
B


use ostringstream and istringstream instead of sscanf.
.
User: "Bint"

Title: Re: string reading with sscanf 14 Jan 2008 11:50:20 AM
I don't think my compiler has that. Is that part of standard C/C++? Is
there an include file for it?
Thanks
B
"David Côme" <davidcome@wanadoo.fr> wrote in message
news:op.t4xkrqjurttu86@debian...
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.com> wrote:

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry"
etc

i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no more.
if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values
of
the first u/name, right? is there any way to retrieve the string pointer
position from sscanf so that I can just call it again from that point in
the
string?

thanks
B


use ostringstream and istringstream instead of sscanf.
.
User: "=?utf-8?Q?David_C=C3=B4me?="

Title: Re: string reading with sscanf 14 Jan 2008 11:54:12 AM
On Mon, 14 Jan 2008 18:50:20 +0100, Bint <bint@csgs.com> wrote:

I don't think my compiler has that. Is that part of standard C/C++? Is
there an include file for it?

Thanks
B


"David Côme" <davidcome@wanadoo.fr> wrote in message
news:op.t4xkrqjurttu86@debian...
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.com> wrote:

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=barry"
etc

i can use sscanf(string,"success=%d", &d) to get the success value. but
after that i just want to read name and u pairs until there are no
more.
if
Iwere to do a
sscanf (string,"success=%d&u=%d&name=%s"), that would get me the values
of
the first u/name, right? is there any way to retrieve the string
pointer
position from sscanf so that I can just call it again from that point in
the
string?

thanks
B


use ostringstream and istringstream instead of sscanf.


ostringstream and istringstream are standard classes of C++
PS: Don't reply at top.
.
User: "Bint"

Title: Re: string reading with sscanf 14 Jan 2008 12:00:33 PM
ok thank you I got it. it's not clear right off how to use that do what I'm
trying to do though, i haven't really used streams at all
.
User: "=?utf-8?Q?David_C=C3=B4me?="

Title: Re: string reading with sscanf 14 Jan 2008 12:05:42 PM
On Mon, 14 Jan 2008 19:00:33 +0100, Bint <bint@csgs.com> wrote:

ok thank you I got it. it's not clear right off how to use that do what
I'm
trying to do though, i haven't really used streams at all


Generaly use C++ tools when you can and C tools when you must.
So use std::string instead of array of char,stream instead of FILE* ....
.




User: "James Kanze"

Title: Re: string reading with sscanf 14 Jan 2008 03:05:44 PM
On Jan 14, 6:41 pm, David C=F4me <davidc...@wanadoo.fr> wrote:

On Mon, 14 Jan 2008 18:06:12 +0100, Bint <b...@csgs.com> wrote:

i have a string "success=3D1&u=3D0&name=3Dbint&u=3D1&name=3Dlucy&u=3D2&n=

ame=3Dbarry"

etc
i can use sscanf(string,"success=3D%d", &d) to get the success
value. but after that i just want to read name and u pairs
until there are no more. if Iwere to do a
sscanf (string,"success=3D%d&u=3D%d&name=3D%s"), that would get me the v=

alues

of the first u/name, right? is there any way to retrieve
the string pointer position from sscanf so that I can just
call it again from that point in the string?

use ostringstream and istringstream instead of sscanf.

I'm not sure that either are really appropriate here. If I've
understood him correctly, he's got a '&' separated list of
attribute value pairs. The easiest way of handling this is
probably something like my FieldArray classes; a first pass
which converts the string into a vector of strings, with one
attribute value pair in each element. Then split up the
elements into the attribute and the value (perhaps
std::transform with a conversion function---boost::regex could
probably help here).
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34
.



  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER