473,237 Members | 1,227 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,237 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 26957
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%*s0%6s Heres the data: SS000000395000000000DC-07998291174503725 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); ....
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...

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.