Sscanf
Name:
Sscanf ()-read data that matches the specified format from a string.
Function prototype:
Int sscanf (const char *, const char *,...);
Header file:
# Include <stdio. h>
Note:
Similar to scanf, sscanf is used for input, but the latter uses the keyboard (stdin) as the input source, and the former uses a fixed string as the input source.
Example:
1. Common usage.
Char Buf [512];
Sscanf ("123456", "% s", Buf); // here Buf is the array name, which means to store 123456 in the form of % s into Buf!
Printf ("% s/n", Buf );
Result: 123456
2. Take a string of the specified length. In the following example, a string with a maximum length of 4 bytes is obtained.
Sscanf ("123456", "% 4 s", Buf );
Printf ("% s/n", Buf );
Result: 1234
3. Obtain the string of the specified character. For example, in the following example, the string is obtained when a space is encountered.
Sscanf ("123456 abcdedf", "% [^]", Buf );
Printf ("% s/n", Buf );
Result: 123456
4. Take a string that only contains the specified character set. For example, in the following example, take a string that only contains 1 to 9 letters and lowercase letters.
Sscanf ("123456 abcdedfbcdef", "% [1-9a-z]", Buf );
Printf ("% s/n", Buf );
Result: 123456 abcdedf
When input:
Sscanf ("123456 abcdedfbcdef", "% [1-9a-z]", Buf );
Printf ("% s/n", Buf );
Result: 123456
5. Obtain the string of the specified character set. For example, in the following example, a string with uppercase letters is used.
Sscanf ("123456 abcdedfbcdef", "% [^ A-Z]", Buf );
Printf ("% s/n", Buf );
Result: 123456 abcdedf
6. Given a string iios/12ddwdff @ 122, get the string between/and @ and filter out "iios/" first, then, send a string of content other than '@' to the Buf.
Sscanf ("iios/12ddwdff @ 122", "% * [^/]/% [^ @]", Buf );
Printf ("% s/n", Buf );
Result: 12 ddwdff.
7. Given a string "Hello, world", only world is retained. (Note: There is a space after)
Sscanf ("Hello, world", "% * S % s", Buf );
Printf ("% s/n", Buf );
Result: World
% * S indicates that the first matching % s is filtered out, that is, hello is filtered out.
If there is no space, the result is null.
Sscanf is similar to a regular expression, but does not have a strong regular expression. Therefore, we recommend that you use a regular expression for complex string processing.
//-------------------------------------------------------
Use it to separate strings such as 2006: 03: 18:
Int A, B, C;
/* Sscanf ("200:0:18", "% d: % d", a, B, c); * // * the error method must be in the variables A, B, add the address character before C, modified by huanmie_09 */
Sscanf ("200:0:18", "% d: % d", & A, & B, & C );
And-2006: 04: 18:
Char sztime1 [16] = "", sztime2 [16] = "";
Sscanf ("2006:0:18-2006:04:18", "% s-% s", sztime1, sztime2 );
But later, I needed to handle
The space on both sides of '-' is canceled, but the % s definition of the string is broken.
I need to re-design a function to handle this situation? This is not complicated, but in order to make all the Code have a uniform style, I need to change many places and replace the existing sscanf with my own split function. I thought I must do this and fell asleep with a strong dissatisfaction with sscanf. I woke up and found that I didn't have.
The format-type has a type field such as %. If the string to be read is not separated by spaces, you can use % [].
% [] Is similar to a regular expression. [A-Z] indicates that all characters of A-Z are read, and [^ A-Z] indicates that all characters except a-Z are read.
That's why the problem was solved:
Sscanf ("2006:0:18-2006:04:18", "% [0-9,:]-% [0-9,:]", sztime1, sztime2 );
Post http://community.csd (remove me) N. N (remove me) et/expert/topic/4843/4843294 .xml? In temp =. 4321558, a cool sscanf use case is provided, and then the sscanf is awesome after learning.
Original problem:
Iios/12ddwdff @ 122
How to obtain the string between/and @?
Is there any function in the C program?
Code:
# Include <stdio. h>
Int main ()
{
Const char * s = "iios/12ddwdff @ 122 ";
Char Buf [20];
Sscanf (S, "% * [^/]/% [^ @]", Buf );
Printf ("% s/n", Buf );
Return 0;
}
Result: 12 ddwdff.
Similar to scanf, sscanf is used for input, but the latter uses the screen (stdin) as the input source, and the former uses a fixed string as the input source.
Function prototype:
Int scanf (const char * Format [, argument]...);
The format can be one or more {% [*] [width] [{H | L | i64 | L}] type | ''| '/T' | '/ n' | non-% sign },
Note: {A | B | c} indicates A, B, and C. Select [d], which indicates D or D.
Width: width, which can be ignored. Its usage is as follows:
Const char sourcestr [] = "Hello, world ";
Char Buf [10] =;
Sscanf (sourcestr, "% 5 s", Buf); // % 5 s, only 5 Characters
Cout <Buf <Endl;
Result: Hello
{H | L | i64 | L}: parameter size. Generally, h indicates the size of a single byte, I indicates the size of 2 bytes, and l indicates the size of 4 bytes (double exception ), l64 indicates 8-byte size.
Type: this is a lot, that is, % s, % d and so on.
Special:
% * [Width] [{H | L | i64 | L}] type indicates that values that meet this condition are filtered out and no value is written to the target parameter. For example:
Const char sourcestr [] = "Hello, world ";
Char Buf [10] =;
Sscanf (sourcestr, "% * S % s", Buf); // % * s indicates that the first matching % s is filtered out, that is, hello is filtered out.
Cout <Buf <Endl;
Result: World
Collection operations are supported:
% [A-Z] indicates matching any character in A to Z, greedy (as many as possible)
% [AB '] matches a, B, and', greedy
% [^ A] matches any character other than a, greedy
Are you familiar with it? Yes, it's very similar to regular expressions, and it still supports filtering, that is, % * [A-Z]. For example:
Example:
Const char * s = "iios/12ddwdff @ 122 ";
Char Buf [20];
Sscanf (S, "% * [^/]/% [^ @]", Buf );
Printf ("% s/n", Buf );
Take the string from example 3-to the specified character. For example, in the following example, the string is obtained when a space is encountered.
Sscanf ("123456 abcdedf", "% [^]", Buf );
Printf ("% s/n", Buf );
Result: 123456
So the code should be summarized:
Const char * s = "iios/12ddwdff @ 122 ";
Char Buf [20];
Sscanf (S, "% * [^/]/% [^ @]", Buf );
Printf ("% s/n", Buf );
First, filter out "iios/", and then a string of 12 ddwdff until the character '@' (in Example 3, you can get this string to @, and remove @ 122). The content is: 12ddwdff is sent to the Buf. The result is displayed.