|
|
 |
 |
 |
 |
sscanf Question
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
alij <aliasger.jaf @gmail.com> writes: > 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.
On Sat, 02 Jun 2007 04:03:02 -0700, alij <aliasger.jaf@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 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
On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse
<ben.use @bsb.me.uk> wrote: >alij <aliasger.jaf @gmail.com> writes: >> 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
Barry Schwarz <schwa @doezl.net> writes: > On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse > <ben.use @bsb.me.uk> wrote: >>alij <aliasger.jaf@gmail.com> writes: >>> 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.
On Jun 2, 12:41 pm, Ben Bacarisse <ben.use@bsb.me.uk> wrote:
> Barry Schwarz <schwa @doezl.net> writes: > > On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse > > <ben.use @bsb.me.uk> wrote: > >>alij <aliasger.jaf@gmail.com> writes: > >>> 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 - >
Thank you gentlemen for your help!! I think I will use strstr function (as adviced)
On Jun 2, 4:31 pm, alij <aliasger.jaf@gmail.com> wrote:
> On Jun 2, 12:41 pm, Ben Bacarisse <ben.use @bsb.me.uk> wrote: > > Barry Schwarz <schwa@doezl.net> writes: > > > On Sat, 02 Jun 2007 15:44:59 +0100, Ben Bacarisse > > > <ben.use@bsb.me.uk> wrote: > > >>alij <aliasger.jaf@gmail.com> writes: > > >>> 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 - > > > Thank you gentlemen for your help!! I think I will use strstr function > (as adviced)- Hide quoted text - >
Sorry, I meant strchr -- thank you once again
|
 |
 |
 |
 |
|