Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > how to use sscanf?

Reply
Thread Tools

how to use sscanf?

 
 
nick
Guest
Posts: n/a
 
      11-30-2005
is it similar to scanf?
when i use scanf it can read the words in the screen automatically one
after another.i use a char array to store the string,then use sscanf to
read the words,but it just only reat out the first word in the string
array every time. so if i want to read the words in the string one by
one, just like scanf, what should i do?

thanks!
 
Reply With Quote
 
 
 
 
Saif
Guest
Posts: n/a
 
      11-30-2005
nick wrote:
> is it similar to scanf?
> when i use scanf it can read the words in the screen automatically one
> after another.i use a char array to store the string,then use sscanf to
> read the words,but it just only reat out the first word in the string
> array every time. so if i want to read the words in the string one by
> one, just like scanf, what should i do?


If all you're going to read is words (strings), you can increment the
buffer pointer passed to sscanf by the length of the string previously
read.

Assuming your complete string is pointed to by char *str and you want
to read each word from it into another already allocated character
array char *word. Then...

/*Read first word*/
sscanf(str,"%s", word);
/*Read next word*/
sscanf(str+strlen(word), "%s", word);

You can repeat this to read consecutive strings.

sscanf is typically used though when you know exactly the number and
type of fields you want to extract from the parent string. You will
then use sscanf just once and get all the fields in one shot instead of
having to manipulate the buffer pointer for each field you read.

 
Reply With Quote
 
 
 
 
Becker
Guest
Posts: n/a
 
      11-30-2005
More basically,

The scanf() prototype is:
/*
---------------------------------------------------------------------------------------------
*/
int scanf ( const char * format [ , argument , ...] );

The sscanf() prototype is:
/*
---------------------------------------------------------------------------------------------
*/
int sscanf ( char * buffer, const char * format [ , argument , ...] );


I guess you must be familiar with the function scanf(), which reads
data from the standard input(stdin) and stores it to the locations
specified by the argument(s) passed to it(scanf()).
sscanf() reads data from the specified -buffer- and stores it into the
locations by the argument(s).

Just as what Saif said:
> sscanf is typically used though when you know exactly the number and
> type of fields you want to extract from the parent string. You will
> then use sscanf just once and get all the fields in one shot instead of
> having to manipulate the buffer pointer for each field you read.


/* BEGING */
#include <stdio.h>

int main (void)
{
char specifiedBuffer[] = "C is a good programming language!";
char str1[10], str2[10];
int i;

sscanf (specifiedBuffer, "%s %*s %*s %s", str1, str2);
printf ("%s => %s\n", str1, str2);

return 0;
}

/* END */

Output:
C => good

/*
Becker
*/

 
Reply With Quote
 
Becker
Guest
Posts: n/a
 
      11-30-2005
More basically,

The scanf() prototype is:
/* ------------------------------------------------*------------------
*/
int scanf ( const char * format [ , argument , ...] );

The sscanf() prototype is:
/* ------------------------------------------------*------------------
*/
int sscanf ( char * buffer, const char * format [ , argument , ...] );



I guess you must be familiar with the function scanf(), which reads
data from the standard input(stdin) and stores it to the locations
specified by the argument(s) passed to it(scanf()).
sscanf() reads data from the specified -buffer- and stores it into the
locations by the argument(s).

Just as what Saif said:

> sscanf is typically used though when you know exactly the number and
> type of fields you want to extract from the parent string. You will
> then use sscanf just once and get all the fields in one shot instead of
> having to manipulate the buffer pointer for each field you read.



/* BEGING */
#include <stdio.h>

int main (void)
{
char specifiedBuffer[] = "C is a good programming language!";
char str1[10], str2[10];

sscanf (specifiedBuffer, "%s %*s %*s %s", str1, str2);
printf ("%s => %s\n", str1, str2);

return 0;
}

/* END */

Output:
C => good


/*
Becker
*/

 
Reply With Quote
 
Suman
Guest
Posts: n/a
 
      11-30-2005
Becker wrote:
> More basically,
>
> The scanf() prototype is:
> /* ------------------------------------------------*------------------
> */
> int scanf ( const char * format [ , argument , ...] );


I have:
7.19.6.4 The scanf function
Synopsis
1 #include <stdio.h>
int scanf(const char * restrict format, ...);

> The sscanf() prototype is:
> /* ------------------------------------------------*------------------
> */
> int sscanf ( char * buffer, const char * format [ , argument , ...] );
>

I have:
7.19.6.7 The sscanf function
Synopsis
1 #include <stdio.h>
int sscanf(const char * restrict s,
const char * restrict format, ...);

> /* BEGING */




> #include <stdio.h>
>
> int main (void)
> {
> char specifiedBuffer[] = "C is a good programming language!";

And what happens when there's a typo like:
char unspecifiedBuffer[] = "pooooorprogramming language!";
> char str1[10], str2[10];
>
> sscanf (specifiedBuffer, "%s %*s %*s %s", str1, str2);

sscanf (unspecifiedBuffer, "%s %*s %*s %s", str1, str2);

Ought to check return values of *scanf() and friends...

[snip]

 
Reply With Quote
 
nick
Guest
Posts: n/a
 
      11-30-2005
thanks yours reply, but i have another question, the question is, how to
check where is the end of the string?

thanks!
 
Reply With Quote
 
Jordan Abel
Guest
Posts: n/a
 
      11-30-2005
On 2005-11-30, nick <(E-Mail Removed)> wrote:
> thanks yours reply, but i have another question, the question is, how to
> check where is the end of the string?


strlen(str) returns an index, strchr(str,0) a pointer; pick your poison.
 
Reply With Quote
 
Dave Thompson
Guest
Posts: n/a
 
      12-14-2005
On 30 Nov 2005 03:03:18 -0800, "Saif" <(E-Mail Removed)> wrote:

> nick wrote:
> > <snip> so if i want to read the words in the string one by
> > one, just like scanf, what should i do?

>
> If all you're going to read is words (strings), you can increment the
> buffer pointer passed to sscanf by the length of the string previously
> read.
>
> Assuming your complete string is pointed to by char *str and you want
> to read each word from it into another already allocated character
> array char *word. Then...
>
> /*Read first word*/
> sscanf(str,"%s", word);
> /*Read next word*/
> sscanf(str+strlen(word), "%s", word);
>
> You can repeat this to read consecutive strings.
>

%s _skips whitespace_ and then reads a string of non-whitespace, i.e.
a "word". Or fails due to hitting the end of the input, which you
should catch by checking the return value, as you should for all
*scanf variants. strlen(word) doesn't allow for the whitespace. If
there is leading whitespace in the input string, this will (first)
fail for second word; otherwise for the third.

Also, %s (and %[) in *scanf should always be given with a length
limit, to prevent either accidentally or maliciously exceeding the
actual object (buffer) size and causing Undefined Behavior, which in
the latter (malicious) case is likely to be destroying your data
and/or stealing your money. Unless you are absolutely 100% sure the
input is valid, which in practice is only if was generated by a valid
sprintf call or similar in the line immediately preceding the sscanf
call, in which case you already have the data and don't need to scan.

Try:
char * ptr = str; /* if not already a pointer you can spare */
int used;
if( sscanf (ptr, "%Ns%n", word, &used) < 1 ) /* error */
ptr += used;
if( sscan (ptr, ...

- David.Thompson1 at worldnet.att.net
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Could not use ''; file already in use. M K ASP .Net 11 04-09-2008 11:35 AM
where to use CPLD & where to use FPGA? kulkarku@math.net VHDL 6 03-06-2006 07:27 AM
Can I use XPath or something to a remote Mac or Linux box and just query an xml file, not using web services and use encyrption? jake ASP .Net 0 07-06-2004 02:16 PM
Cannot use the profile "default" because it is in use, not. please.post@yur.re.ply Firefox 1 07-04-2004 03:41 AM



Advertisments