By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,513 Members | 1,653 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,513 IT Pros & Developers. It's quick & easy.

sscanf Question

P: n/a
Hi,

I have a string (pointed by variable sourceStr) in the following
possible formats:

? ls : ps
? ls -a : touch nfile
>From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.

I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.

Any Idea if its possible to do this using sscanf function, or on what
I'm doing wrong? I'll appreciate any pointers.

Thanks!!

Alij

Jun 2 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
alij <al*************@gmail.comwrites:
Hi,

I have a string (pointed by variable sourceStr) in the following
possible formats:

? ls : ps
? ls -a : touch nfile
>>From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.

I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.
Suddenly the scanf family is everybody's favourite.

You'd be better off using strchr:

char *divider;
if ((divider = strchr(sourceStr, ':')) != NULL &&
divider >= sourceStr + 2) {
/* the first string runs from sourceStr + 2 and has length
divider - sourceStr - 2. The second one runs from
divider (or divider + 1 if the space is *always* there)
to the end of the string. */
}

Obviously more or less checking could be done, depending on what you
know about the format (more is almost always to be preferred!).

--
Ben.
Jun 2 '07 #2

P: n/a
On Sat, 02 Jun 2007 04:03:02 -0700, alij <al*************@gmail.com>
wrote:
>Hi,

I have a string (pointed by variable sourceStr) in the following
possible formats:

? ls : ps
? ls -a : touch nfile
>>From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.

I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.

Any Idea if its possible to do this using sscanf function, or on what
I'm doing wrong? I'll appreciate any pointers.
You are asking sscanf to convert two items. You should test the
return value to see if it succeeded.

In the first case, the return value is 2. In the second, it is 1.
This would have told you that your format string is not doing what you
want. You need to figure out what <space colon spacebetween two
conversion specifications really means. Then you need to determine
what to replace it with that does what you really want (which is
probably something along the lines of skip everything until you find a
colon, skip the colon, and skip the space which is guaranteed to
follow the colon).

As Ben suggested, you may be better off not even using sscanf.

By the way, since a command name can include a path, I hope you made
cmd1 and cmd2 large enough to accommodate the longest path allowed in
your system.
Remove del for email
Jun 2 '07 #3

P: n/a
On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse
<be********@bsb.me.ukwrote:
>alij <al*************@gmail.comwrites:
>Hi,

I have a string (pointed by variable sourceStr) in the following
possible formats:

? ls : ps
? ls -a : touch nfile
>>>From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.

I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.

Suddenly the scanf family is everybody's favourite.

You'd be better off using strchr:

char *divider;
if ((divider = strchr(sourceStr, ':')) != NULL &&
Agree with your concept. If the colon can appear other than as a
command separator (e.g., path name, command argument, etc), it might
be better to use strstr with a target of " : ".
divider >= sourceStr + 2) {
/* the first string runs from sourceStr + 2 and has length
divider - sourceStr - 2. The second one runs from
divider (or divider + 1 if the space is *always* there)
to the end of the string. */
}

Obviously more or less checking could be done, depending on what you
know about the format (more is almost always to be preferred!).

Remove del for email
Jun 2 '07 #4

P: n/a
Barry Schwarz <sc******@doezl.netwrites:
On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse
<be********@bsb.me.ukwrote:
>>alij <al*************@gmail.comwrites:
>>Hi,

I have a string (pointed by variable sourceStr) in the following
possible formats:

? ls : ps
? ls -a : touch nfile

From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.

I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.

Suddenly the scanf family is everybody's favourite.

You'd be better off using strchr:

char *divider;
if ((divider = strchr(sourceStr, ':')) != NULL &&

Agree with your concept. If the colon can appear other than as a
command separator (e.g., path name, command argument, etc), it might
be better to use strstr with a target of " : ".
Very neat, yes.

Following on (from that idea) but directed more to the OP, I have, on
occasion, found it useful to have null-safe version of the search
functions, together with one for adding:

char *ns_add(char *str, ptrdiff_t n)
{
return str ? str + n : str;
}

char *ns_strstr(char *str, const char *s)
{
return str ? strstr(str, s) : str;
}

so one can write:

const char *second = ns_add(ns_strstr(cmd, " : "), 3);
if (second) ...

and be sure that the NULL will propagate up even if cmd was NULL.

--
Ben.
Jun 2 '07 #5

P: n/a
On Jun 2, 12:41 pm, Ben Bacarisse <ben.use...@bsb.me.ukwrote:
Barry Schwarz <schwa...@doezl.netwrites:
On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse
<ben.use...@bsb.me.ukwrote:
>alij <aliasger.jaf...@gmail.comwrites:
>Hi,
>I have a string (pointed by variable sourceStr) in the following
possible formats:
>? ls : ps
? ls -a : touch nfile
>>>From the lines above, I want to extract the commands, which are ls, ps
and ls -a, touch nfile.
>I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
values, but the problem I'm getting is, it works fine for the first
example, but not the second example.
>Suddenly the scanf family is everybody's favourite.
>You'd be better off using strchr:
char *divider;
if ((divider = strchr(sourceStr, ':')) != NULL &&
Agree with your concept. If the colon can appear other than as a
command separator (e.g., path name, command argument, etc), it might
be better to use strstr with a target of " : ".

Very neat, yes.

Following on (from that idea) but directed more to the OP, I have, on
occasion, found it useful to have null-safe version of the search
functions, together with one for adding:

char *ns_add(char *str, ptrdiff_t n)
{
return str ? str + n : str;

}

char *ns_strstr(char *str, const char *s)
{
return str ? strstr(str, s) : str;

}

so one can write:

const char *second = ns_add(ns_strstr(cmd, " : "), 3);
if (second) ...

and be sure that the NULL will propagate up even if cmd was NULL.

--
Ben.- Hide quoted text -

- Show quoted text -
Thank you gentlemen for your help!! I think I will use strstr function
(as adviced)

Jun 2 '07 #6

P: n/a
On Jun 2, 4:31 pm, alij <aliasger.jaf...@gmail.comwrote:
On Jun 2, 12:41 pm, Ben Bacarisse <ben.use...@bsb.me.ukwrote:


Barry Schwarz <schwa...@doezl.netwrites:
On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse
<ben.use...@bsb.me.ukwrote:
>>alij <aliasger.jaf...@gmail.comwrites:
>>Hi,
>>I have a string (pointed by variable sourceStr) in the following
>>possible formats:
>>? ls : ps
>>? ls -a : touch nfile
>>>>From the lines above, I want to extract the commands, which are ls, ps
>>and ls -a, touch nfile.
>>I used sscanf(sourceStr, "? %s : %s", cmd1, cmd2) to extract the
>>values, but the problem I'm getting is, it works fine for the first
>>example, but not the second example.
>>Suddenly the scanf family is everybody's favourite.
>>You'd be better off using strchr:
> char *divider;
> if ((divider = strchr(sourceStr, ':')) != NULL &&
Agree with your concept. If the colon can appear other than as a
command separator (e.g., path name, command argument, etc), it might
be better to use strstr with a target of " : ".
Very neat, yes.
Following on (from that idea) but directed more to the OP, I have, on
occasion, found it useful to have null-safe version of the search
functions, together with one for adding:
char *ns_add(char *str, ptrdiff_t n)
{
return str ? str + n : str;
}
char *ns_strstr(char *str, const char *s)
{
return str ? strstr(str, s) : str;
}
so one can write:
const char *second = ns_add(ns_strstr(cmd, " : "), 3);
if (second) ...
and be sure that the NULL will propagate up even if cmd was NULL.
--
Ben.- Hide quoted text -
- Show quoted text -

Thank you gentlemen for your help!! I think I will use strstr function
(as adviced)- Hide quoted text -

- Show quoted text -
Sorry, I meant strchr -- thank you once again

Jun 2 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.