473,386 Members | 1,779 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

how to use sscanf?

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!
Nov 30 '05 #1
7 26985
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.

Nov 30 '05 #2
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
*/

Nov 30 '05 #3
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
*/

Nov 30 '05 #4
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]

Nov 30 '05 #5
thanks yours reply, but i have another question, the question is, how to
check where is the end of the string?

thanks!
Nov 30 '05 #6
On 2005-11-30, nick <i1********@yahoo.com> 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.
Nov 30 '05 #7
On 30 Nov 2005 03:03:18 -0800, "Saif" <sa****@gmail.com> 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
Dec 14 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: Allan Bruce | last post by:
If I have sscanf("FL:%s:%d:%s\n", lGuid, &lID, lFileName); and the last string contains spaces, e.g. my complete string "FL:1234ABCD:3:FileName With Spaces.txt\n" does sscanf just make...
4
by: smshahriar | last post by:
Hi, I want to scan from the following string all the hex numbers and populate an array of integers: 0x27 0x00 0x30 0x00 0x33 0x00 0x36 0x00
10
by: baumann | last post by:
hi, 1) first test program code #include <stdio.h> int main(void) { char * file = "aaa 23 32 m 2.23 ammasd"; int i2,i3;
4
by: baumann | last post by:
hi all there has 2 program 1) the first test program code #include <stdio.h> int main(void) {
5
by: jchludzinski | last post by:
I'm using strtok() to parse thru a line and read different numbers: float value; char *token; token = strtok( line, " " ); .... sscanf( token, "%f", &value ); These results are less...
22
by: Superfox il Volpone | last post by:
Hello I have some problem with sscanf, I tryed this code but it doesn't works : char* stringa = "18/2005" char mese; char anno; int i_letture; i_letture = sscanf(stringa, "%2s/%4s",...
8
by: Artemio | last post by:
Dear folks, I need some help with using the sscanf() function. I need to parse a string which has several parameters given in a "A=... B=... C=..." way, and each has a different type (one is a...
20
by: AMP | last post by:
Hello, Anybody know if anything exists like sscanf in c. I found a few things OL but most were pretty old. Maybe something has come along since 2004? Thanks Mike
5
by: Alex Mathieu | last post by:
Hi, using sscanf, I'm trying to retrieve something, but nothing seems to work. Here's the pattern: SS%*sþ0þ%6s Heres the data: SS000000395000000000DC-þ0þ799829þ1174503725þ Actually, I...
7
by: gio | last post by:
suppose I have: .... char str1; char str2; int ret; fgets(str1, LEN, stdin); //str1 can contain just '\n' and '\0' ret=sscanf(str1, "%s", str2); ....
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.