Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

C Programming Language

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:

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

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

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:

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:

Sorry, I meant strchr -- thank you once again
Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc