468,512 Members | 1,337 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,512 developers. It's quick & easy.

string reading with sscanf

i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry" 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
Jan 14 '08 #1
9 6358
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bi**@csgs.comwrote:
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry"
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 thevalues
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.

Jan 14 '08 #2
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" <da*******@wanadoo.frwrote in message
news:op.t4xkrqjurttu86@debian...
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bi**@csgs.comwrote:
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry"
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.
Jan 14 '08 #3
On Mon, 14 Jan 2008 18:50:20 +0100, Bint <bi**@csgs.comwrote:
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" <da*******@wanadoo.frwrote in message
news:op.t4xkrqjurttu86@debian...
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bi**@csgs.comwrote:
>i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry"
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.
Jan 14 '08 #4
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
Jan 14 '08 #5
On Mon, 14 Jan 2008 19:00:33 +0100, Bint <bi**@csgs.comwrote:
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* ....
Jan 14 '08 #6
On Jan 14, 6:41 pm, David Côme <davidc...@wanadoo.frwrote:
On Mon, 14 Jan 2008 18:06:12 +0100, Bint <b...@csgs.comwrote:
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry"
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?
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: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
Jan 14 '08 #7
"Bint" <bi**@csgs.comwrote:
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry" 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=ba rry";

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';
}
}
Jan 14 '08 #8
On Jan 14, 3:39 pm, "Daniel T." <danie...@earthlink.netwrote:
"Bint" <b...@csgs.comwrote:
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry" 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=ba rry";

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.
Jan 14 '08 #9
In article <13*************@corp.supernews.com>, bi**@csgs.com says...
i have a string "success=1&u=0&name=bint&u=1&name=lucy&u=2&name=ba rry" 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::stringuname;

// 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::stringvalues;

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.
Jan 15 '08 #10

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Steve | last post: by
10 posts views Thread by Ithaqua | last post: by
7 posts views Thread by gio | last post: by
3 posts views Thread by gav82 | last post: by
6 posts views Thread by Richard | last post: by
1 post views Thread by agarwalsuchin | last post: by
1 post views Thread by fmendoza | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.