sscanf Question

A

alij

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
 
B

Ben Bacarisse

alij said:
Hi,

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

? ls : ps
? ls -a : touch nfile

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!).
 
B

Barry Schwarz

Hi,

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

? ls : ps
? ls -a : touch nfile

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 space> between 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
 
B

Barry Schwarz

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
 
B

Ben Bacarisse

Barry Schwarz said:
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.
 
A

alij

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.

Thank you gentlemen for your help!! I think I will use strstr function
(as adviced)
 
A

alij

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top